summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfengweihao <[email protected]>2019-08-07 19:24:13 +0800
committerfengweihao <[email protected]>2019-08-07 19:24:13 +0800
commit8fa489316be959ed85136d4aa51243cf3f6aefca (patch)
tree28c67bbc7fe4141132a9381e58138912e060eda7
parent5e684f980b2d401ba5cb4b546fa9c517a2f04891 (diff)
证书校检工具
-rw-r--r--ca/mesalab-ca-untrust.pem51
-rw-r--r--ca/mesalab-ca.pem50
-rw-r--r--ca/tango-ca-v3-trust-ca.pem51
-rw-r--r--ca/tango-ca-v3-untrust-ca.pem51
-rw-r--r--conf/cert_store.ini44
-rw-r--r--conf/pxy_obj_keyring.json83
-rw-r--r--conf/table_info.conf20
-rw-r--r--release/ReadMe0
-rw-r--r--rule/full/COMPILE.local2
-rw-r--r--rule/full/GROUP.local3
-rw-r--r--rule/full/PXY_OBJ_KEYRING.local8
-rw-r--r--rule/full/index/full_config_index.00000000013
-rw-r--r--rule/inc/COMPILE.local2
-rw-r--r--rule/inc/GROUP.local3
-rw-r--r--rule/inc/PXY_OBJ_KEYRING.local8
-rw-r--r--rule/inc/index/full_config_index.00000000023
-rw-r--r--src/Makefile56
-rw-r--r--src/cert_conf.c177
-rw-r--r--src/cert_conf.h86
-rw-r--r--src/cert_daemon.c120
-rw-r--r--src/cert_daemon.h13
-rw-r--r--src/cert_session.c2016
-rw-r--r--src/cert_session.h56
-rw-r--r--src/cert_store.c133
-rw-r--r--src/components/json/arraylist.c101
-rw-r--r--src/components/json/arraylist.h56
-rw-r--r--src/components/json/bits.h28
-rw-r--r--src/components/json/config.h175
-rw-r--r--src/components/json/debug.c83
-rw-r--r--src/components/json/debug.h71
-rw-r--r--src/components/json/json.h34
-rw-r--r--src/components/json/json.mk45
-rw-r--r--src/components/json/json_c_version.c20
-rw-r--r--src/components/json/json_c_version.h22
-rw-r--r--src/components/json/json_checker.c421
-rw-r--r--src/components/json/json_checker.h39
-rw-r--r--src/components/json/json_config.h4
-rw-r--r--src/components/json/json_inttypes.h28
-rw-r--r--src/components/json/json_object.c868
-rw-r--r--src/components/json/json_object.h617
-rw-r--r--src/components/json/json_object_iterator.c168
-rw-r--r--src/components/json/json_object_iterator.h239
-rw-r--r--src/components/json/json_object_private.h47
-rw-r--r--src/components/json/json_tokener.c888
-rw-r--r--src/components/json/json_tokener.h208
-rw-r--r--src/components/json/json_util.c300
-rw-r--r--src/components/json/json_util.h41
-rw-r--r--src/components/json/libjson.c26
-rw-r--r--src/components/json/linkhash.c602
-rw-r--r--src/components/json/linkhash.h292
-rw-r--r--src/components/json/math_compat.h28
-rw-r--r--src/components/json/parse_flags.c50
-rw-r--r--src/components/json/parse_flags.h4
-rw-r--r--src/components/json/printbuf.c192
-rw-r--r--src/components/json/printbuf.h77
-rw-r--r--src/components/json/random_seed.c237
-rw-r--r--src/components/json/random_seed.h25
-rw-r--r--src/components/redis/async.h130
-rw-r--r--src/components/redis/hiredis.h199
-rw-r--r--src/components/redis/libevent.h108
-rw-r--r--src/components/redis/rd_lock.c257
-rw-r--r--src/components/redis/rd_lock.h28
-rw-r--r--src/components/redis/read.h111
-rw-r--r--src/components/redis/redis.mk40
-rw-r--r--src/components/redis/sds.h273
-rw-r--r--src/components/syslogd/logging.c55
-rw-r--r--src/components/syslogd/logging.h51
-rw-r--r--src/components/syslogd/syslog.mk40
-rw-r--r--src/inc/MESA_atomic.h38
-rw-r--r--src/inc/MESA_handle_logger.h63
-rw-r--r--src/inc/MESA_htable.h419
-rw-r--r--src/inc/MESA_list.h34
-rw-r--r--src/inc/MESA_list_count.h31
-rw-r--r--src/inc/MESA_list_queue.h115
-rw-r--r--src/inc/MESA_prof_load.h189
-rw-r--r--src/inc/MESA_ring_queue.h107
-rw-r--r--src/inc/Maat_command.h167
-rw-r--r--src/inc/Maat_rule.h289
-rw-r--r--src/inc/field_stat2.h68
-rw-r--r--src/inc/gram_index_engine.h68
-rw-r--r--src/inc/inc.mk33
-rw-r--r--src/inc/moodycamel_field_stat2.cpp60
-rw-r--r--src/inc/moodycamel_field_stat2.h63
-rw-r--r--src/inc/moodycamel_maat_rule.cpp90
-rw-r--r--src/inc/moodycamel_maat_rule.h84
-rw-r--r--src/inc/stream_fuzzy_hash.h78
-rw-r--r--src/lib/libMESA_field_stat2.abin58804 -> 0 bytes
-rw-r--r--src/lib/libMESA_handle_logger.abin60466 -> 0 bytes
-rw-r--r--src/lib/libMESA_prof_load.abin30360 -> 0 bytes
-rw-r--r--src/lib/libhiredis.abin507652 -> 0 bytes
-rw-r--r--src/package/r2_certstore3
-rw-r--r--src/package/r3_certstore17
-rw-r--r--src/script/signssl.sh204
-rw-r--r--src/script/tarball.sh39
-rw-r--r--src/script/x509bin2439248 -> 0 bytes
-rw-r--r--src/x509.c831
96 files changed, 856 insertions, 12601 deletions
diff --git a/ca/mesalab-ca-untrust.pem b/ca/mesalab-ca-untrust.pem
deleted file mode 100644
index 7bda39f..0000000
--- a/ca/mesalab-ca-untrust.pem
+++ /dev/null
@@ -1,51 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEA2A8LZpO9fE1h0DiHt4uhpdZdFg6RhQGo8Lg51drJFZl09bmU
-5nVzxbuBxoXmMwJLjn1yfUNy/XwUSPO56OfhVwhZxCxtbi9SosxQ/4whSRr2IMFg
-zX4vTZKbWAmoPSaTtpSKVEFVLnB2T4nBESfjgIM9zurKexPfkvlUcWFPxeCmqEJ4
-yTDIa3cykUDUIedeHm54/xUD4SySilENxk0TvbiCrpmMaHsFx7puV4EM7X2EICmw
-u3qG8cRTSNOQLptVvbeWRrU3UeCacARIZdSvZYCoAOFlsuYgW26i0aysFswK/JQb
-lKt2BQwfF/leVpPTkynVX2cPlLAwmShTwSEUgwIDAQABAoIBAENbFVPKNSVePmMa
-bHz1A9TeajCpJAaSCOfalvUresrIB2VfkKLz9L6tAP0x2x0F1yY5x4pzj5KkrvI7
-QTbxqxdl3A5DR241RI7KIWo5dlsDE74MazBE6VxGmzUr9Y3yy9P8pM81eue6Wbfc
-GxtNEyiKQaeTHMKX5Hg+UGv0SVlHZ/PiWb+GKyzdKQQdhoD0Y6RXt83ezuEDOy2R
-TeMnT0GjP9HP33TebO1ISHPcUVgXxrCUrw6fsfRxCtAMjdhnL25qGaI5hgBwjLxv
-ixeCav3xDIH0/drN8cz/cTr7e/yZZUPoVBmEY3NCXjZjbKghq3A//WnKtsULZVBX
-FSQLrQECgYEA+ChzW1dHJfYQKq92wBDgS/lsNBSRtK08od0N4TErqsQOOzZIEvEF
-HrcBeZHSiNU8lhwo+q8Wm62D9x9bOhVRGkCenb3Abad3ccv0mZkRIt3Gg838fLjo
-i2oFREBMShxEJn1l7noVaJ5J7uVRTsmqs17XW+KA3oU8d0tbz9om8AMCgYEA3uLq
-2TVRlkqlXnK6uK3qtUNghJLSCdOeMTI5eGIX63NZl8lQ3qMNx/HLve06rHx6u7dA
-gXs1Y1CLGSAePAysAYFDa/ttmVaHN0nhJwMGWj4s9eNPXfvo///36Featc2bJyCf
-KK7Fp3Y/dQP8ozWSlizWHmXOChHxhTUiikDbYYECgYBHkMLT0LPACtpWtQt2EGff
-AStnSZdLl7ooo+tgyiFhufCwutLGQ6PKW9SdDqS8uWIjmDNpOB05AC1Sk0Rn18Xv
-4DreGt7nwKf9tWfw8+exOmwJjtoFzf2iVwz1xeU6ajRtNTS0NZj+9sczkgaExjvo
-Rq2s3gF0KtBpRt5PbwZTqQKBgQDJOBdJbUdw5YcSE4XbALgqWN+kEGCrGm9wfqU/
-t19c41B5JfhqZs4kOnjzyF32JpMvMSt9OdxjAu3xCvwAvnfzC93weJbjniiIk5w+
-+g4cHpG8kzCt6qTZqR8IlT5I74wo8Nx/f/lVS/3SCH1mYxEpnuTXoJU4piZjWisK
-oa7tAQKBgQCM+Du7Ps3C2DwrudPMtr6lgxcaC10sKyUkKqPVt5wB8ojwrqd2Scvk
-1T074ez6xPxEN4k3QYI0J0fWTC53psi3XGZzori1KzoQ7YgfzBcb7NMGb/tCWRB0
-F75k1Ww7WIbq+7nbtfioKF1lDaMOD1XZXQbyzJ5xZQxhjp6qg7flPg==
------END RSA PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIID+DCCAuCgAwIBAgIUaOU9sDBZjun5lpiEUYGlPfapr0EwDQYJKoZIhvcNAQEL
-BQAwOjEbMBkGA1UECgwSbWVzYWxhYi1jYS11bnRydXN0MRswGQYDVQQDDBJtZXNh
-bGFiLWNhLXVudHJ1c3QwHhcNMTgwODIzMDkxMDMzWhcNMTkwODIzMDkxMDMzWjA6
-MRswGQYDVQQKDBJtZXNhbGFiLWNhLXVudHJ1c3QxGzAZBgNVBAMMEm1lc2FsYWIt
-Y2EtdW50cnVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgPC2aT
-vXxNYdA4h7eLoaXWXRYOkYUBqPC4OdXayRWZdPW5lOZ1c8W7gcaF5jMCS459cn1D
-cv18FEjzuejn4VcIWcQsbW4vUqLMUP+MIUka9iDBYM1+L02Sm1gJqD0mk7aUilRB
-VS5wdk+JwREn44CDPc7qynsT35L5VHFhT8XgpqhCeMkwyGt3MpFA1CHnXh5ueP8V
-A+EskopRDcZNE724gq6ZjGh7Bce6bleBDO19hCApsLt6hvHEU0jTkC6bVb23lka1
-N1HgmnAESGXUr2WAqADhZbLmIFtuotGsrBbMCvyUG5SrdgUMHxf5XlaT05Mp1V9n
-D5SwMJkoU8EhFIMCAwEAAaOB9TCB8jAdBgNVHQ4EFgQUaaCnRZhCxEWc2PkirshL
-9UqISVAwHwYDVR0jBBgwFoAUaaCnRZhCxEWc2PkirshL9UqISVAwDwYDVR0TAQH/
-BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAgQwfwYDVR0lBHgwdgYIKwYBBQUHAwEG
-CCsGAQUFBwMCBggrBgEFBQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIBggrBgEFBQcD
-CQYKKwYBBAGCNwoDAQYIKwYBBQUHAxEGCisGAQQBgjcCARUGCisGAQQBgjcCARYG
-CisGAQQBgjcKAwQwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQDMeBJC
-/xTEv0YAcbYjCqiBmpxYd5lpGtPl9ODZtRgDWtT3y+fD6MgQOTWIlYsJua5dzpQt
-xG8M//XZx9J/CIMz+YL81B88SpPeUuaeapje3txA2GfwpAK51yTqh32IdUlRXZ5W
-Tcuv8kOE3UWFHLDjkqNSTiVMVqgf51YuGUwvMxF/cgwD+qBJK8wHQSEI6Jhzb3pB
-zjzZ96U0VwljvBh3F3QlOCuKAwFjPRXJ3T9WeMEbrfx4041vos/3hZiCZCjE8Y8V
-A8RimaFkrT6TQdrxJ3u+/cVqlyh7eCdqiOfmMji1DmmRVo+vJMPeeTc0aUgVOu0l
-j68REFRAOFPnue+s
------END CERTIFICATE-----
diff --git a/ca/mesalab-ca.pem b/ca/mesalab-ca.pem
deleted file mode 100644
index 8769ec9..0000000
--- a/ca/mesalab-ca.pem
+++ /dev/null
@@ -1,50 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDCctOkD7Zd5/RX
-AqiFuavsRO5hwGbljKle4A2URgCnGFJ0K8lloZbOeUM8vgQA1PMzeD/dLfDyazmn
-gH65mdQTjgR+YaX9SaagvT2Tb+aPz9q46B2nQtMQ4ilXNyjx4gXaIY8beNjCxwO8
-4CPG/+TqX9gGiFsbygf7AJXPRsjWP3tXGIHHkz9+utm0upFMh5204AHlLxWC0Jr+
-uGKT1oLxgDXhQCdBKZUywBl+5OFKUI9vyHVmcJ9vXEnuOge9taH4vw7b2iJbMEQ3
-+4jD+qOJZDVpUIRLyQmT3f6CnAbmo1urwMa6knNO6BbO3MJmiAwyi0Uv9CugygVo
-9JwHHrJ7AgMBAAECggEAQ/ZSVpNPUD8UPZ0mPacJmgj1sKDI1g513D0/QcW90KlF
-mGj9eVIjHYNwprhbOdc0MZcj6zB1eKVVf1//6usDHtqSY4HJvF+Tp7a84N1JnpYt
-gldOlflbQBlsDZmv6+rt1LHKDPYN/PYGLmvA1Xr3DZv2K0JZZbsVUvt/YPUCmS72
-/Br1keFlvKeKdFRxFHznkLgE/5ZjtcxrwFc6pbp4LFyG1SzbQ655+XeXR/08Khi4
-Lsj2Xf9P7Yk8hgOVhx8+GRiR33Zoi5SiKvvnhXkR6QWzUvvnp6pqNbTDy2os9OFH
-nmlyMbTSbm9gk1JHw3xMbrPLtxx9T3tkZGhox33UoQKBgQDgLbK6vp9eZZQyF2is
-42YFYVgC2g3QDd+e34pN+1q581DkTJ75t3e/CosX1R6ApDnDmkfQDhLRlPmkCrH0
-Z+M7cjDzhPbDGcwgO/ag21osre6zWWJsDK6e64T1a3RmA4W13Nmyu+UCZSp/k0ng
-Te+jzdar8HZpeCu7FtxXrfdmIwKBgQDeDMmPueeF1WMa6KMJknA1CrwUgYlZ4nc8
-wYNjSYAq0b2k73M9OR4oxYEm843HrXpOIXFMpA38M7yMSBIVURMYtrd4TUvBwwVY
-/GBA94d1g91xKAMTiPRDRYpCvB1R56xLQ0ddXULAm2Xvt6QxrC+1/TZNzJOAn0z/
-JwNauVQLyQKBgQC5J+VT6jeU7s8M5Fq3WQYdcX4QtOrtqVfGT5lauT0BEp8AQOyZ
-EdiceGfTolmUJI/1J4sio00VvzbFL3Q1ikya/8DAkVSCZd87zGryBtoexvW9OhlZ
-ZswfRCVH0p2L2GLqh2NjBV+rr8T/I7bDxXslTtB8qJoUmIV9++63mF8bAwKBgQC+
-GKBuZS8qSlZ/8O2zAiUBo+EEhSk7RD/kSZ7b307UWZ9LlptHrKB/MyawXA3jBkcQ
-oFzIyiIW6YvfZMvmZ/Q7UiGb4kCa7wSi+9zDgaX8Gxn3B9QqYzMKbHxDSZyoQ/gi
-rsRnz7GYBvGr2cG9rLVjzhUxYZRdpwNZ5OJgRw0G0QKBgQC0nQiEHJ+c5PV2JcSB
-S5ux2yjbB0TcM7iOLvCy5tpd8w5paGsJHqNR93o/lB82A6nn7QO1vj6M3CU04SwC
-X74noxaiys0huVTMfJ3PrAm2AEE9jWlkI2X2F7s6sraSdcKKHlRQv+SI5X936nxF
-2W/lCSj77xdiebatxFUlJT7O7g==
------END PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIIDpTCCAo2gAwIBAgIGDdgTuLYiMA0GCSqGSIb3DQEBCwUAMCoxEzARBgNVBAMM
-Cm1lc2FsYWItY2ExEzARBgNVBAoMCm1lc2FsYWItY2EwHhcNMTgwMzI1MTY1MTM2
-WhcNMjEwMzI2MTY1MTM2WjAqMRMwEQYDVQQDDAptZXNhbGFiLWNhMRMwEQYDVQQK
-DAptZXNhbGFiLWNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwnLT
-pA+2Xef0VwKohbmr7ETuYcBm5YypXuANlEYApxhSdCvJZaGWznlDPL4EANTzM3g/
-3S3w8ms5p4B+uZnUE44EfmGl/UmmoL09k2/mj8/auOgdp0LTEOIpVzco8eIF2iGP
-G3jYwscDvOAjxv/k6l/YBohbG8oH+wCVz0bI1j97VxiBx5M/frrZtLqRTIedtOAB
-5S8VgtCa/rhik9aC8YA14UAnQSmVMsAZfuThSlCPb8h1ZnCfb1xJ7joHvbWh+L8O
-29oiWzBEN/uIw/qjiWQ1aVCES8kJk93+gpwG5qNbq8DGupJzTugWztzCZogMMotF
-L/QroMoFaPScBx6yewIDAQABo4HQMIHNMA8GA1UdEwEB/wQFMAMBAf8wEQYJYIZI
-AYb4QgEBBAQDAgIEMHgGA1UdJQRxMG8GCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB
-BQUHAwQGCCsGAQUFBwMIBgorBgEEAYI3AgEVBgorBgEEAYI3AgEWBgorBgEEAYI3
-CgMBBgorBgEEAYI3CgMDBgorBgEEAYI3CgMEBglghkgBhvhCBAEwDgYDVR0PAQH/
-BAQDAgEGMB0GA1UdDgQWBBSQJL1m7FTdhYC0Odubg/8ebnloLTANBgkqhkiG9w0B
-AQsFAAOCAQEAaVPocMiqwZK/0tROUz/W23DwGC+npZOyhAuGRze5YBV+zpVBhPv5
-8MeDkUr5jcoN8Papt5uq+6EHv+8fbVPTWBQRNuJD/WZ+CLkWTmDCyc+vbdXfsrRD
-i135Q+Q72oyEsLUbZMaYvNQ2tJ4Pb0Qjwcc5GSDXJJFhwqIPa9eYiZwRcg/cUvps
-ATgdZ5mZl1AfaINtXO1Y9Ic8PJcUotPSJ+YoG08dkAYrvo9Jc/n63ZOvnj0HVqBA
-JgWKjwoxNv1BiU2vEI6KBGO76hBidvcBHSnpvKSfiKwbMSp3Kai/+MHnVBfgp3yo
-WgeGkqyqiYEAZImAh/ps02XqtPWj9Sl2zQ==
------END CERTIFICATE-----
diff --git a/ca/tango-ca-v3-trust-ca.pem b/ca/tango-ca-v3-trust-ca.pem
deleted file mode 100644
index df0ea43..0000000
--- a/ca/tango-ca-v3-trust-ca.pem
+++ /dev/null
@@ -1,51 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDJ6NvcrjBM17LJ
-+lD2RM+2A4tcwppfgb08ZQnsVEjtltat6c4x9sj9VqqOatIo+9GHGZ/FKSacnADx
-utm/pWSr2nxtrJdM1SCqR9OF2eZGfhdJK2ufWLcOkX7/+CEAXVEOXL4xxnNS55Lu
-OyCMOidPkq+Xzk1SJBIrpFrpctMxTFzJcvu35chtkF1IxPhN1dTVW6LJtz55U8gv
-J0Blg/w7EkfsHd/KHvBMdpbGx02vTnWUXPYGyi2wvOy5ptOthrSlxyxGwmByehPP
-s5XGk7M8m2eZzf+Kb5i/2e+wE8PrXCpGL1Picj4Ab1hLFyZVRtNVfVzqk+kCEv6e
-chbp2fE/AgMBAAECggEBAMC6imuqxaYD2sCbNH7ujgpidbuUckCqGdU1aPRyO662
-ZbNaUx00QQQ5ntIUuwit3oID/pL3RckFzIzxW3poyKCWDGGv9jg71FNV/l1s8jbl
-kxqf3Loct5erYDu7QN0VNhLsigv/LwO60nCedeIEfJOjJANWxE2c6s9HshPWLCuH
-0g/iOhm7+8QpZc9O/D4izUJkVVDThWlDjrgVX0p58k2VuECxEsyuMrRG+1B/hwkg
-+US+pmKywrxTl9cjkoXPPRvEnt+gdI5b1F3HIdK+MD7uJhBdmAoEH45T+5B9EIRG
-3OQwneGm/Ti4GQvXGQJgRlFCTd9f+6NK7etOTTI/6bkCgYEA92dJQ+DFzg+H5pC7
-8cC2aWyfmQaGNQiGn0Vbb+OTNUUrFoEkHWnx3229fkArxuBr3GUmqxgSMVlVadYR
-R7kFaUe5x+DBQNWkKN2BjO60cSSkDL2qpMyjGdsk815LqclGOZwzecF+Y4d2Pjg+
-nEXBjVjhEX5rCpfw/SCWJdqCHgsCgYEA0OzkzOD7m6OPXY+SXjcfoGx0wIS2Iw0J
-QDEJvs4Xsxxi/jSe69PIWXooJjuiPFi9yF+eroyU1/gPs+toKjKLeOK6lR/Da2Xq
-chlS3DnLwjGCMHEDGgUKWiBpNJgqhFrQtNfPn17vQAgUDv8AefKKxk9WV0I26MmP
-7FuzOLWN3h0CgYEAqX2nIcuBeBQHxJtvRsYBsePqysk/dGGs6Lx5UgQUu6/xPu+m
-MEh+ndTutul7lDn3avwZK6nH/Or4qxMur3ZAEMpEqnx9qM80MZLeyBBYqhKyGNBv
-cYuISZRqkhgNufncFGfAlC9NSR5qkWGy8xiO6yjyuCtlZdKGFMQYWUKDVdUCgYEA
-hMAhWXUTKn+w1rglPqwz8lE3liQ9PuRHnnwKPyzgrjQ5SmDRIfN9eC1AWZrGqSWR
-4UGwqCQ3Z0r9X0sS8s0PBg66k4qNNy6Y20rv9XLb31Zp7LHCUMQnIcE6V+rgCR1T
-Q7Vk/VTrHHqFlEm/Wb0dJIjAyc0O6rc4NezGYiAqNpkCgYADwUmclyFqwjfW1n1C
-sTgLr2KR7klBWMwQi40QNXLGVW+Yz0mkXC9zAvNZppQPPlzMvdnVtnAaCxPf5l2t
-sYOp0iEo5LWxjuFA4yKNgQiLKMGTfaWmhR+jckCtS+teDAkqDkq053pOH+k39sDS
-uSpbZibQO4PvyFDs/pOGfTu8Hw==
------END PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIIDzTCCArWgAwIBAgIGDhoh7QVJMA0GCSqGSIb3DQEBCwUAMD4xIDAeBgNVBAMM
-F1RhbmdvIFNlY3VyZSBHYXRld2F5IENBMRowGAYDVQQKDBFNYXNlcmF0aSBTb2x1
-dGlvbjAeFw0xOTAyMTcwMTM1MTJaFw0yMjAyMTgwMTM1MTJaMD4xIDAeBgNVBAMM
-F1RhbmdvIFNlY3VyZSBHYXRld2F5IENBMRowGAYDVQQKDBFNYXNlcmF0aSBTb2x1
-dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMno29yuMEzXssn6
-UPZEz7YDi1zCml+BvTxlCexUSO2W1q3pzjH2yP1Wqo5q0ij70YcZn8UpJpycAPG6
-2b+lZKvafG2sl0zVIKpH04XZ5kZ+F0kra59Ytw6Rfv/4IQBdUQ5cvjHGc1Lnku47
-IIw6J0+Sr5fOTVIkEiukWuly0zFMXMly+7flyG2QXUjE+E3V1NVbosm3PnlTyC8n
-QGWD/DsSR+wd38oe8Ex2lsbHTa9OdZRc9gbKLbC87Lmm062GtKXHLEbCYHJ6E8+z
-lcaTszybZ5nN/4pvmL/Z77ATw+tcKkYvU+JyPgBvWEsXJlVG01V9XOqT6QIS/p5y
-FunZ8T8CAwEAAaOB0DCBzTAPBgNVHRMBAf8EBTADAQH/MBEGCWCGSAGG+EIBAQQE
-AwICBDB4BgNVHSUEcTBvBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMEBggr
-BgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYB
-BAGCNwoDAwYKKwYBBAGCNwoDBAYJYIZIAYb4QgQBMA4GA1UdDwEB/wQEAwIBBjAd
-BgNVHQ4EFgQULQNPIvNlh8oGhVmVqAG3syRbdWAwDQYJKoZIhvcNAQELBQADggEB
-AAzCDOWcu38Sw+AWQSq5y0RwL6ga8W5hB0HTqxPpnUUhZN3LMl8F3E/1JK/wWDWF
-meJACTiL/rMDSWFUz57xGm4SmiPSOgWmToQ5PYahyNlkw9uODxRyl84zEMp/MXfi
-LL57v3XFRnTbTHaEu3ew/Xjkhq1/mhwYblP17iPq1i8o4AqX2OGLIueDrz3j80AV
-syrm3cFE5jPJHvvVuArvIDdCnhCX2g0Es6cYSYppMxRtRiZnydqJ3o326zTigdIB
-8zYflognJJkV2lavt0nz4NkvmlOj3S88smWxxYRzKEpEw8/m+DbhGIx6R7w0Ot6Q
-bzLgBvYDF+BCkkjaQCR334M=
------END CERTIFICATE-----
diff --git a/ca/tango-ca-v3-untrust-ca.pem b/ca/tango-ca-v3-untrust-ca.pem
deleted file mode 100644
index ba03c06..0000000
--- a/ca/tango-ca-v3-untrust-ca.pem
+++ /dev/null
@@ -1,51 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCrtAM/GPvdhxsA
-uipj2ohNEN7NCD11fu3wDQ8rO+n2BXdTobpfMh816e7vtPSz1VEMYr4DTRe8GpEp
-Yj3bxnWLVAe9+M4A1E1a/K9F50wqlF/Mm12MlSF3hscPRwfO1k0tYcNwVOfuoyTD
-BvqVXxZaz+nM70h38wkfqfaOeLC/eB7khejq5HSCQvTPtBShY8ZhAIPkybk8YUBH
-IQjHV4vqRGxkAgSxgrT7z99Sqd8NJE48M0b7IyhaWisGHCa2KDK7xbPRzojX9Oi2
-F/rraZZo4t6p9ab7SxV/+JZ7juE5PbGJs+cXJe3fufXAisGtX2LougxQEpO6BB8c
-1j4gtF7rAgMBAAECggEANbwqX+7Ts+p6WunoJkPX8DZdY9E2WrUUhdGwc5lWiPYA
-+B1fFDe9aMQDUOVSx4z0xmmIicPwr5+o2kiyjzs2whnUKnHZFo1agCUgPUI7pf+1
-U3Uz+7EYPi3h0jgqi2Kp2JAF9/u6cgaAlMB0X5bYiicTRl2EUnWu30fzr3a56dGM
-nKf3p9ELEud7ax+kC7fEspJoxSWVbqHK1d78OubfsUjyiE9zAC1znH8nZURYx5SP
-u7k6L9lcBOAqLQ2//zAVLvjdcpATFsgodnQQYFHRYkJSjmIY50dIuqf0JwtGZVYt
-xtOaxE5jDc2odh9Ly7jVYTspX4QN3KlkiUmAfeSMkQKBgQDYv4Rn+FiPaRkNazJI
-WSzsGKLjnd8gNfQjh65wqTDDGECjBH8xtzIuOJ+XXc/L+iNGRsf9grnWsTJsuMby
-u+YD3OfHFpsbHaYtTNP64e/hUk5MHE1oNLmptFTnqFyreICPJaGJToOjTiunF/rj
-cS32/z6B7JbfufWvtMH7yvI+RQKBgQDKzDQmjrvjc4yhVnB71TwqKVKGi5YdQPM/
-WfLUgXebzy+ZhwdDhIGoNs9GR1WRakJrPBQdpWazEK0ig9qYMa0lki26QyhfyZg1
-eYkDgIxvA8/AJxlp0gYgAdn34WhQDoSHQW4jEiMJIxV0uvzvMpMDyewLEQ+k6dLB
-87/Cur9TbwKBgGCBhXa1gNj5tone/NhxvCqzHXOzSzGQVE+tjeHjsy5qkf0Dd46v
-PsyNsaE3x9nOWf5kbY9WsWACLa1y6EITn2qA5UIjspP0M5Vf69J83s24U9xXja+k
-KjaBcHxk3j4KvVL/Mllsd/gySgVwC+lQ72JWa4J10Qd0SQwes3BlAE7xAoGAEo3U
-R6LPdePgffJWoD3GH2Vgc4bZ2RtUJfuox+CAfPTbugQsmfTJmAZLuHZWUdOS+BSr
-EntLhh6EeJ/vo/UHjmRtYpk6XGkpT9squfNM5etHWqE5JgFdJhiFRLSOwqRRY76M
-wRCru+5FzEQ/V/McmEAlJG4PLFtoOO6AIOTNFGkCgYAY+e5iN+VUJ4ziFn5Ytjhd
-8fs2YajiLMrS5r7gANVAJIA0991ZkJGTSosSqwMM3cM9fsS0kfWKv64QgW5M1uGX
-3eJl7ojVilxFMCzS+OdjUOrVQFE7P1/fDozxwvFOfYZE024XAY0PvAme59m8Kbqt
-1H4MiZbv4gVIbK5mI9ZzFw==
------END PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIGDhoh7clOMA0GCSqGSIb3DQEBCwUAMEYxKDAmBgNVBAMM
-H1RhbmdvIFNlY3VyZSBHYXRld2F5IENBIFVOVFJVU1QxGjAYBgNVBAoMEU1hc2Vy
-YXRpIFNvbHV0aW9uMB4XDTE5MDIxNzAxMzUxN1oXDTIyMDIxODAxMzUxN1owRjEo
-MCYGA1UEAwwfVGFuZ28gU2VjdXJlIEdhdGV3YXkgQ0EgVU5UUlVTVDEaMBgGA1UE
-CgwRTWFzZXJhdGkgU29sdXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQCrtAM/GPvdhxsAuipj2ohNEN7NCD11fu3wDQ8rO+n2BXdTobpfMh816e7v
-tPSz1VEMYr4DTRe8GpEpYj3bxnWLVAe9+M4A1E1a/K9F50wqlF/Mm12MlSF3hscP
-RwfO1k0tYcNwVOfuoyTDBvqVXxZaz+nM70h38wkfqfaOeLC/eB7khejq5HSCQvTP
-tBShY8ZhAIPkybk8YUBHIQjHV4vqRGxkAgSxgrT7z99Sqd8NJE48M0b7IyhaWisG
-HCa2KDK7xbPRzojX9Oi2F/rraZZo4t6p9ab7SxV/+JZ7juE5PbGJs+cXJe3fufXA
-isGtX2LougxQEpO6BB8c1j4gtF7rAgMBAAGjgdAwgc0wDwYDVR0TAQH/BAUwAwEB
-/zARBglghkgBhvhCAQEEBAMCAgQweAYDVR0lBHEwbwYIKwYBBQUHAwEGCCsGAQUF
-BwMCBggrBgEFBQcDBAYIKwYBBQUHAwgGCisGAQQBgjcCARUGCisGAQQBgjcCARYG
-CisGAQQBgjcKAwEGCisGAQQBgjcKAwMGCisGAQQBgjcKAwQGCWCGSAGG+EIEATAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFI/dacOl4JQdR9xDiWpJf/2mvblUMA0G
-CSqGSIb3DQEBCwUAA4IBAQAOWQiEcJqpen1/AXfprE+9uqwQWt/Gh8UPYZPE7Kcc
-VnhlqTDO+nGLVPM97ju/NjFNojJaMxsKBHVcRRHA3V+sKtqoHNUVhHJLtMDvh+2w
-vloUM11ckgilIOYqFzjeIL11NB4ivAN7V9jP6Sh8gC31Q6Ttd6FkJ7f9QObQ6sKT
-OEmaMqKVe6H0+U4jhQF3/gSW+PAIb1YIJof/wtewBCDm5Pp2UYaNlrnMGTIxayXQ
-Cc+h16oDTRPBsLZgDkmR5fslRH9CAbxC4/b2M1jU/MKlWlu7ThzAPPEtEKqpiLSi
-Ebfe/jvJ786VcXwO09FWfCiUjE9Gf4rbMZjkkHOL7UPa
------END CERTIFICATE-----
diff --git a/conf/cert_store.ini b/conf/cert_store.ini
deleted file mode 100644
index 6929e72..0000000
--- a/conf/cert_store.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-[SYSTEM]
-#1:print on screen, 0:don't
-DEBUG_SWITCH = 1
-#10:DEBUG, 20:INFO, 30:FATAL
-RUN_LOG_LEVEL = 10
-RUN_LOG_PATH = ./logs
-[CONFIG]
-#Number of running threads
-thread-nu = 4
-#Local default root certificate is valid for 30 days by default
-expire_after = 30
-#Local default root certificate path
-local_debug = 0
-ca_path = ./cert/tango-ca-v3-trust-ca.pem
-untrusted_ca_path = ./cert/mesalab-ca-untrust.pem
-[NTC_MAAT]
-#Configure the load mode,
-#0: using the configuration distribution network
-#1: using local json
-#2: using Redis reads
-maat_json_switch=2
-#When the loading mode is sent to the network, set the scanning configuration modification interval (s).
-effective_interval=1
-#Specify the location of the configuration library table file
-table_info=./conf/table_info.conf
-#Incremental profile path
-inc_cfg_dir=./rule/inc/index
-#Full profile path
-full_cfg_dir=./rule/full/index
-#Json file path when json schema is used
-pxy_obj_keyring=./conf/pxy_obj_keyring.json
-[LIBEVENT]
-#Local monitor port number, default is 9991
-port = 9991
-[CERTSTORE_REDIS]
-#The Redis server IP address and port number where the certificate is stored locally
-ip = 127.0.0.1
-port = 6379
-[MAAT_REDIS]
-#Maat monitors the Redsi server IP address and port number
-ip = 192.168.11.243
-port = 6379
-dbindex = 4
-
diff --git a/conf/pxy_obj_keyring.json b/conf/pxy_obj_keyring.json
deleted file mode 100644
index 0ee74d5..0000000
--- a/conf/pxy_obj_keyring.json
+++ /dev/null
@@ -1,83 +0,0 @@
-{
- "compile_table": "COMPILE",
- "group_table": "GROUP",
- "rules": [
- {
- "compile_id": 123,
- "service": 1,
- "action": 1,
- "do_blacklist": 1,
- "do_log": 1,
- "effective_range": 0,
- "user_region": "escaped\\bdata:have\\ba\\bspace\\band\\ba\\b\\&\\bsymbol.",
- "is_valid": "yes",
- "groups": [
- {
- "group_name": "IP_group",
- "regions": [
- {
- "table_name": "IP_CONFIG",
- "table_type": "ip",
- "table_content": {
- "addr_type": "ipv4",
- "src_ip": "10.0.6.201",
- "mask_src_ip": "255.255.0.0",
- "src_port": "0",
- "mask_src_port": "65535",
- "dst_ip": "0.0.0.0",
- "mask_dst_ip": "255.255.255.255",
- "dst_port": "0",
- "mask_dst_port": "65535",
- "protocol": 6,
- "direction": "double"
- }
- },
- {
- "table_name": "IP_CONFIG",
- "table_type": "ip",
- "table_content": {
- "addr_type": "ipv6",
- "src_ip": "2001:da8:205:1::101",
- "mask_src_ip": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000",
- "src_port": "0",
- "mask_src_port": "65535",
- "dst_ip": "0::0",
- "mask_dst_ip": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
- "dst_port": "0",
- "mask_dst_port": "65535",
- "protocol": 6,
- "direction": "double"
- }
- }
- ]
- },
- {
- "group_name": "Untitled",
- "regions": [
- {
- "table_name": "HTTP_URL",
- "table_type": "string",
- "table_content": {
- "keywords": "abckkk&123",
- "expr_type": "and",
- "match_method": "sub",
- "format": "uncase plain"
- }
- }
- ]
- }
- ]
- }
- ],
- "plugin_table": [
- {
- "table_name": "PXY_PROFILE_KEYRING",
- "table_content": [
- "0\tname_01\troot\t/home/fengweihao/workspace/cert_store/test_data/tango-ca-v3-untrust-ca.pem\t/home/fengweihao/workspace/cert_store/test_data/tango-ca-v3-untrust-ca.pem\t30\tNULL\tNULL\t1\t",
- "1\tname_01\troot\t/home/fengweihao/workspace/cert_store/test_data/tango-ca-v3-trust-ca.pem\t/home/fengweihao/workspace/cert_store/test_data/tango-ca-v3-trust-ca.pem\t30\tNULL\tNULL\t1\t",
-
- "2\tname_01\tintermediate\t/home/fengweihao/workspace/cert_store/test_data/Tango-National-Proxy-L2.key\t/home/fengweihao/workspace/cert_store/test_data/Tango-National-Proxy-L2.pem\t30\tNULL\tNULL\t1\t"
- ]
- }
- ]
-}
diff --git a/conf/table_info.conf b/conf/table_info.conf
deleted file mode 100644
index 69dca58..0000000
--- a/conf/table_info.conf
+++ /dev/null
@@ -1,20 +0,0 @@
-#each collumn seperate with '\t'
-#id (0~65535)
-#name string
-#type one of ip,expr,expr_plus,digest,intval,compile or plugin
-#src_charset one of GBK,BIG5,UNICODE,UTF8
-#dst_charset combined by GBK,BIG5,UNICODE,UTF8,seperate with '/'
-#do_merege [yes/no]
-#cross cache [number]
-#quick mode [quickon/quickoff], default [quickoff]
-#For ip/intval/digest/compile/group
-#id name type
-#
-#For plugin table
-#id name type valid_column
-#
-#For expr/expr_plus Table
-#id name type src_charset dst_charset do_merge cross_cache quick_mode
-1 COMPILE compile
-2 GROUP group
-3 PXY_PROFILE_KEYRING plugin {"key":1,"valid":9,"foreign":"4,5"}
diff --git a/release/ReadMe b/release/ReadMe
deleted file mode 100644
index e69de29..0000000
--- a/release/ReadMe
+++ /dev/null
diff --git a/rule/full/COMPILE.local b/rule/full/COMPILE.local
deleted file mode 100644
index d605788..0000000
--- a/rule/full/COMPILE.local
+++ /dev/null
@@ -1,2 +0,0 @@
-0000000001
-123 1 1 1 1 0 escaped\bdata:have\ba\bspace\band\ba\b\&\bsymbol. 1
diff --git a/rule/full/GROUP.local b/rule/full/GROUP.local
deleted file mode 100644
index f583103..0000000
--- a/rule/full/GROUP.local
+++ /dev/null
@@ -1,3 +0,0 @@
-0000000002
-0 123 1
-1 123 1
diff --git a/rule/full/PXY_OBJ_KEYRING.local b/rule/full/PXY_OBJ_KEYRING.local
deleted file mode 100644
index fba5fb5..0000000
--- a/rule/full/PXY_OBJ_KEYRING.local
+++ /dev/null
@@ -1,8 +0,0 @@
-0000000007
-1 1 name_01 root /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 15 rsa2048 null 1
-2 1 name_02 root /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 90 rsa2048 null 1
-3 1 name_03 root /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 30 rsa2048 null 1
-4 1 name_04 end-entity /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 30 rsa2048 null 1
-5 1 name_05 intermediate /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 30 rsa2048 null 0
-6 1 name_06 intermediate /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 30 rsa2048 null 1
-256 1 insec root /home/fengweihao/workspace/cert_store/ca/mesalab-insec-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-insec-cert.cer 30 rsa2048 null 1
diff --git a/rule/full/index/full_config_index.0000000001 b/rule/full/index/full_config_index.0000000001
deleted file mode 100644
index 26ac6b2..0000000
--- a/rule/full/index/full_config_index.0000000001
+++ /dev/null
@@ -1,3 +0,0 @@
-COMPILE 1 ../rule/full/COMPILE.local
-GROUP 2 ../rule/full/GROUP.local
-PXY_OBJ_KEYRING 7 ../rule/full/PXY_OBJ_KEYRING.local
diff --git a/rule/inc/COMPILE.local b/rule/inc/COMPILE.local
deleted file mode 100644
index d605788..0000000
--- a/rule/inc/COMPILE.local
+++ /dev/null
@@ -1,2 +0,0 @@
-0000000001
-123 1 1 1 1 0 escaped\bdata:have\ba\bspace\band\ba\b\&\bsymbol. 1
diff --git a/rule/inc/GROUP.local b/rule/inc/GROUP.local
deleted file mode 100644
index f583103..0000000
--- a/rule/inc/GROUP.local
+++ /dev/null
@@ -1,3 +0,0 @@
-0000000002
-0 123 1
-1 123 1
diff --git a/rule/inc/PXY_OBJ_KEYRING.local b/rule/inc/PXY_OBJ_KEYRING.local
deleted file mode 100644
index fba5fb5..0000000
--- a/rule/inc/PXY_OBJ_KEYRING.local
+++ /dev/null
@@ -1,8 +0,0 @@
-0000000007
-1 1 name_01 root /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 15 rsa2048 null 1
-2 1 name_02 root /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 90 rsa2048 null 1
-3 1 name_03 root /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 30 rsa2048 null 1
-4 1 name_04 end-entity /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 30 rsa2048 null 1
-5 1 name_05 intermediate /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 30 rsa2048 null 0
-6 1 name_06 intermediate /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-ca-cert.cer 30 rsa2048 null 1
-256 1 insec root /home/fengweihao/workspace/cert_store/ca/mesalab-insec-cert.key /home/fengweihao/workspace/cert_store/ca/mesalab-insec-cert.cer 30 rsa2048 null 1
diff --git a/rule/inc/index/full_config_index.0000000002 b/rule/inc/index/full_config_index.0000000002
deleted file mode 100644
index ecb7c3a..0000000
--- a/rule/inc/index/full_config_index.0000000002
+++ /dev/null
@@ -1,3 +0,0 @@
-COMPILE 1 ../rule/inc/COMPILE.local
-GROUP 2 ../rule/inc/GROUP.local
-PXY_OBJ_KEYRING 7 ../rule/inc/PXY_OBJ_KEYRING.local
diff --git a/src/Makefile b/src/Makefile
index be8bf7e..fb52108 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -4,17 +4,16 @@ CERT_ROOT = ..
endif
MAJOR="1.0"
-BUILD=$(shell git log | grep -cE 'Author:.*<.*@.*>')
-BUILDSHA=$(shell git rev-parse --short HEAD)
-BUILD_FINGERPRINT=$(MAJOR).$(BUILD).$(BUILDSHA)
+BUILD="1.0"
+BUILD_FINGERPRINT=$(MAJOR).$(BUILD)
+BUILD_FINGERPRINT2=$(strip $(BUILD_FINGERPRINT))
-VERSION_TARGET:=$(BUILDSHA)
# Default simulation parameters
NUM_PROCESSORS=1
#SPASR_ARCH_TARGET:=linux_64
-TARGET = cert_store
+TARGET = x509
all: ${TARGET}
@@ -28,45 +27,23 @@ LIB_PATH := $(CERT_ROOT)/libs
dir := .
OBJS := \
- $(OBJ_DIR)/cert_store.o \
- $(OBJ_DIR)/cert_conf.o \
- $(OBJ_DIR)/cert_daemon.o\
- $(OBJ_DIR)/cert_session.o\
-
-dir := ./components/syslogd
-include $(dir)/syslog.mk
-OBJS += $(OBJS_$(dir))
-
-dir := ./components/json
-include $(dir)/json.mk
-OBJS += $(OBJS_$(dir))
+ $(OBJ_DIR)/x509.o\
dir := ./rt
include $(dir)/rt.mk
OBJS += $(OBJS_$(dir))
-dir := ./inc
-include $(dir)/inc.mk
-OBJS += $(OBJS_$(dir))
-
-LDFLAGS_GLOBAL += -L ./lib -lcrypto -lssl -levent -lhiredis
-LDFLAGS_GLOBAL += -L ./lib -lMESA_htable -lMESA_field_stat2 -lMESA_handle_logger -lMESA_prof_load
+LDFLAGS_GLOBAL += -L ./lib -lssl -lcrypto
LDFLAGS_GLOBAL += \
- -lpthread -lcrypt -lm -lz -ldl -luuid -lmaatframe -lstdc++
+ -lpthread -lm -lz -ldl -lstdc++
CFLAGS_LOCAL = -std=gnu99 -g -O3 -W -Wall \
-I.\
- -I./components/syslogd\
-I./components/libevent\
- -I./components/redis\
-I./components/openssl\
- -I./components/json\
-I./rt \
- -I./inc \
DEPS := $(objs:.o=.d)
-
-CFLAGS_GLOBAL += -DVERSION_TARGET=\"$(VERSION_TARGET)\"
CLEAN_LIST := $(CLEAN_LIST) $(OBJS) $(DEPS) $(TARGET_LIB) $(OBJ_DIR)
@@ -76,7 +53,24 @@ $(OBJ_DIR)/%.o: $(d)/%.c
include $(CERT_ROOT)/make/application.mk
tarball: cert_store
- sh script/tarball.sh $(TARGET) $(MAJOR).$(BUILD) $(BUILDSHA)
+ if [ ! -d "package/certstroe_run/bin" ]; then mkdir -p "package/certstore_run/bin/"; fi
+ if [ ! -d "package/certstroe_run/conf" ]; then mkdir -p "package/certstore_run/conf"; fi
+ if [ ! -d "package/certstroe_run/cert" ]; then mkdir -p "package/certstore_run/cert"; fi
+ if [ ! -d "package/certstroe_run/rule" ]; then mkdir -p "package/certstore_run/rule"; fi
+ cp cert_store package/certstore_run/bin/certstore1.0
+ cp ../conf/cert_store.ini package/certstore_run/conf/
+ cp ../conf/pxy_obj_keyring.json package/certstore_run/conf
+ cp ../conf/table_info.conf package/certstore_run/conf
+# cp ../ca/mesalab-def-cert.cer package/certstore_run/cert
+# cp ../ca/mesalab-def-cert.key package/certstore_run/cert
+ cp ../ca/* package/certstore_run/cert
+ cp package/Makefile package/certstore_run/
+ cp ../rule/* -rf package/certstore_run/rule/
+ cp package/run.sh package/certstore_run/
+ cd package && tar cpfz certstore_run.tar.gz certstore_run
+ cd ..
+ mv package/certstore_run.tar.gz ../release/
+ rm -rf package/certstore_run
clean:
rm -rf $(CLEAN_LIST)
rm -f $(TARGET)
diff --git a/src/cert_conf.c b/src/cert_conf.c
deleted file mode 100644
index 950f6e0..0000000
--- a/src/cert_conf.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/*************************************************************************
- > File Name: cert_init.c
- > Author: fengweihao
- > Mail:
- > Created Time: Fri 01 Jun 2018 12:06:01 AM PDT
- ************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "rt_string.h"
-#include "rt_common.h"
-#include "rt_file.h"
-#include "cert_conf.h"
-#include "logging.h"
-
-#include "MESA_prof_load.h"
-
-struct config_bucket_t certConfig = {
- .thread_nu = 1,
- .expire_after = 30,
- .ca_path = "./cert/mesalab-ca.pem",
- .uninsec_path = "./cert/mesalab-ca-untrust.pem",
- .addr_t = {9995, 6379, "0.0.0.0", 0, 6379, "0.0.0.0"},
-};
-
-struct config_bucket_t *cert_default_config()
-{
- return &certConfig;
-}
-
-static int load_system_config(char *config)
-{
- int xret = -1;
-
- struct config_bucket_t *rte = cert_default_config();
-
- xret = MESA_load_profile_uint_nodef(config, "CONFIG", "thread-nu", &(rte->thread_nu));
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Reading the number of running threads failed");
- }
-
- xret = MESA_load_profile_uint_nodef(config, "CONFIG", "expire_after", &(rte->expire_after));
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Reading the number of valid time failed");
- }
-
- xret = MESA_load_profile_string_nodef(config, "CONFIG", "ca_path", rte->ca_path, 128);
- if (xret <0 && rt_file_exsit(rte->ca_path)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Read the ca path failed or the (%s) does not exist",
- rte->ca_path);
- goto finish;
-
- }
-
- xret = MESA_load_profile_uint_nodef(config, "CONFIG", "local_debug", &(rte->local_debug));
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Reading the number of local_debug failed");
- }
-
- xret = MESA_load_profile_string_nodef(config, "CONFIG", "untrusted_ca_path", rte->uninsec_path, 128);
- if (xret <0 && rt_file_exsit(rte->uninsec_path)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Read the untrusted ca path failed or the (%s) does not exist",
- rte->ca_path);
- goto finish;
-
- }
-finish:
- return xret;
-}
-
-static int load_module_config(char *config)
-{
- int xret = -1;
-
- struct config_bucket_t *rte = cert_default_config();
-
- xret = MESA_load_profile_short_nodef(config, "LIBEVENT", "port", (short *)&(rte->addr_t.e_port));
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Libevent Port invalid");
- goto finish;
- }
-
- xret = MESA_load_profile_string_nodef(config, "MAAT_REDIS", "ip", rte->addr_t.maat_ip, 16);
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Maat redis ip invalid");
- goto finish;
- }
-
- xret = MESA_load_profile_short_nodef(config, "MAAT_REDIS", "port", (short *)&(rte->addr_t.maat_port));
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Maat redis port invalid");
- goto finish;
- }
-
- xret = MESA_load_profile_short_nodef(config, "MAAT_REDIS", "dbindex", (short *)&(rte->addr_t.dbindex));
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Maat redis dbindex invalid");
- goto finish;
- }
-
- xret = MESA_load_profile_string_nodef(config, "CERTSTORE_REDIS", "ip", rte->addr_t.store_ip, 16);
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Certsotre redis ip invalid");
- goto finish;
- }
-
- xret = MESA_load_profile_short_nodef(config, "CERTSTORE_REDIS", "port", (short *)&(rte->addr_t.store_port));
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Certsotre redis port invalid");
- goto finish;
- }
-
-finish:
- return xret;
-}
-
-static int load_maat_config(char *config)
-{
- int xret = -1;
-
- struct ntc_maat_t *maat_t = &cert_default_config()->maat_t;
-
- xret = MESA_load_profile_uint_nodef(config, "NTC_MAAT", "maat_json_switch", &(maat_t->maat_json_switch));
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Reading the number of running threads failed");
- }
-
- xret = MESA_load_profile_string_nodef(config, "NTC_MAAT", "table_info", maat_t->info_path, 128);
- if (xret < 0 && !rt_file_exsit( maat_t->info_path)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Read the table info failed or the (%s) does not exist",
- maat_t->info_path);
- goto finish;
- }
-
- if (maat_t->maat_json_switch == 1){
- xret = MESA_load_profile_string_nodef(config, "NTC_MAAT", "pxy_obj_keyring", maat_t->pxy_path, 128);
- if (xret < 0 && !rt_file_exsit(maat_t->pxy_path)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Read the pxy obj keyring failed or the (%s) does not exist",
- maat_t->pxy_path);
- goto finish;
- }
- }
-
- if (maat_t->maat_json_switch == 0){
- xret = MESA_load_profile_uint_nodef(config, "NTC_MAAT", "effective_interval", &(maat_t->effective_interval_s));
- if (xret < 0){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Reading the interval of scan failed");
- }
- xret = MESA_load_profile_string_nodef(config, "NTC_MAAT", "inc_cfg_dir", maat_t->inc_cfg_dir, 128);
- if (xret < 0 && !rt_file_exsit( maat_t->inc_cfg_dir)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Read the table info failed or the (%s) does not exist",
- maat_t->inc_cfg_dir);
- goto finish;
- }
- xret = MESA_load_profile_string_nodef(config, "NTC_MAAT", "full_cfg_dir", maat_t->full_cfg_dir, 128);
- if (xret < 0 && !rt_file_exsit( maat_t->full_cfg_dir)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Read the table info failed or the (%s) does not exist",
- maat_t->full_cfg_dir);
- goto finish;
- }
- }
-finish:
- return xret;
-}
-
-void cert_init_config(char *config)
-{
- load_system_config(config);
-
- load_maat_config(config);
-
- load_module_config(config);
-}
-
diff --git a/src/cert_conf.h b/src/cert_conf.h
deleted file mode 100644
index e62636b..0000000
--- a/src/cert_conf.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*************************************************************************
- > File Name: cert_conf.h
- > Author:
- > Mail:
- > Created Time: Fri 01 Jun 2018 12:06:26 AM PDT
- ************************************************************************/
-
-#ifndef _CERT_INIT_H
-#define _CERT_INIT_H
-
-#include <stdio.h>
-#include <string.h>
-#include <stdint.h>
-#include <event.h>
-#include <x509.h>
-#include <evp.h>
-
-#include "moodycamel_maat_rule.h"
-#include "MESA_htable.h"
-
-#define CT_PATH_MAX 256
-#define CT_ARRARY_LEN (CT_PATH_MAX/2)
-#define CT_STRING_MAX 1024
-
-struct request_t{
-#define DATALEN 128
- int thread_id;
- int is_valid;
- char *odata;
- X509 *origin;
- int keyring_id;
- char sni[DATALEN];
- char rkey[DATALEN];
- struct evhttp_request *evh_req;
-};
-
-struct pxy_obj_keyring{
- int keyring_id;
- atomic64_t ref_cnt;
- char keyring_type[CT_ARRARY_LEN];
- uint64_t expire_after;
- char public_algo[CT_STRING_MAX];
- char v3_ctl[CT_STRING_MAX];
- char finger[EVP_MAX_MD_SIZE];
- EVP_PKEY *key;
- X509 *root;
- int is_valid;
- STACK_OF(X509) *stack_ca;
-};
-
-struct _initer_addr_t{
- uint16_t e_port; /*libevent prot*/
- uint16_t maat_port; /*maat redis port*/
- char maat_ip[16]; /*maat redis ip */
- int dbindex; /*maat redis dbindex*/
-
- uint16_t store_port; /*store redis port */
- char store_ip[16]; /*store redis ip*/
-};
-
-struct ntc_maat_t{
- unsigned int maat_json_switch;
- unsigned int effective_interval_s;
- char info_path[128];
- char pxy_path[128];
- char inc_cfg_dir[128];
- char full_cfg_dir[128];
-};
-
-struct config_bucket_t{
- Maat_feather_t feather;
- int table_id;
- unsigned int local_debug;
- unsigned int thread_nu;
- unsigned int expire_after;
- char ca_path[128];
- char uninsec_path[128];
- struct ntc_maat_t maat_t;
- struct _initer_addr_t addr_t;
-};
-
-extern struct config_bucket_t *cert_default_config();
-
-extern void cert_init_config(char *config);
-
-#endif
diff --git a/src/cert_daemon.c b/src/cert_daemon.c
deleted file mode 100644
index 116c945..0000000
--- a/src/cert_daemon.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*************************************************************************
- > File Name: cert_daemon.c
- > Author: fengweihao
- > Mail:
- > Created Time: Tue 29 May 2018 11:12:46 PM PDT
- ************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <signal.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "logging.h"
-
-static volatile sig_atomic_t sigflag = 0;
-
-static void SignalHandlerSigusr1 (__attribute__((unused))int signo) {
- sigflag = 1;
-}
-
-/**
- * \brief Tell the parent process the child is ready
- *
- * \param pid pid of the parent process to signal
- */
-static void TellWaitingParent (pid_t pid) {
- kill(pid, SIGUSR1);
-}
-
-/**
- * \brief Set the parent on stand-by until the child is ready
- *
- * \param pid pid of the child process to wait
- */
-static void WaitForChild (pid_t pid) {
- int status;
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Daemon: Parent waiting for child to be ready...");
- /* Wait until child signals is ready */
- while (sigflag == 0) {
- if (waitpid(pid, &status, WNOHANG)) {
- /* Check if the child is still there, otherwise the parent should exit */
- if (WIFEXITED(status) || WIFSIGNALED(status)) {
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Child died unexpectedly");
- exit(EXIT_FAILURE);
- }
- }
- /* sigsuspend(); */
- sleep(1);
- }
-}
-/**
- * \brief Close stdin, stdout, stderr.Redirect logging info to syslog
- *
- */
-static void SetupLogging (void) {
- /* Redirect stdin, stdout, stderr to /dev/null */
- int fd = open("/dev/null", O_RDWR);
- if (fd < 0)
- return;
- if (dup2(fd, 0) < 0)
- return;
- if (dup2(fd, 1) < 0)
- return;
- if (dup2(fd, 2) < 0)
- return;
- close(fd);
-}
-
-/**
- * \brief Daemonize the process
- *
- */
-void daemonize (void) {
- pid_t pid, sid;
-
- signal(SIGUSR1, SignalHandlerSigusr1);
- /** \todo We should check if wie allow more than 1 instance
- to run simultaneously. Maybe change the behaviour
- through conf file */
-
- /* Creates a new process */
- pid = fork();
-
- if (pid < 0) {
- /* Fork error */
- exit(EXIT_FAILURE);
- } else if (pid == 0) {
- /* Child continues here */
- umask(027);
-
- sid = setsid();
- if (sid < 0) {
- exit(EXIT_FAILURE);
- }
-
- if (chdir("/") < 0) {
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Error changing to working directory '/'");
- }
-
- SetupLogging();
-
- /* Child is ready, tell its parent */
- TellWaitingParent(getppid());
-
- /* Daemon is up and running */
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Daemon is running");
- return;
- }
- /* Parent continues here, waiting for child to be ready */
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Parent is waiting for child to be ready");
- WaitForChild(pid);
-
- /* Parent exits */
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Child is ready, parent exiting");
- exit(EXIT_SUCCESS);
-}
diff --git a/src/cert_daemon.h b/src/cert_daemon.h
deleted file mode 100644
index efe38e3..0000000
--- a/src/cert_daemon.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/*************************************************************************
- > File Name: cert_daemon.h
- > Author:
- > Mail:
- > Created Time: Tue 29 May 2018 11:12:46 PM PDT
- ************************************************************************/
-
-#ifndef _NDPI_DAEMON_H
-#define _NDPI_DAEMON_H
-
-extern void daemonize (void);
-
-#endif
diff --git a/src/cert_session.c b/src/cert_session.c
deleted file mode 100644
index aea02d2..0000000
--- a/src/cert_session.c
+++ /dev/null
@@ -1,2016 +0,0 @@
-/*************************************************************************
- > File Name: cert_session.c
- > Author:
- > Mail:
- > Created Time: Fri 01 Jun 2018 02:00:56 AM PDT
- ************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <assert.h>
-
-/* openssl**/
-#include <opensslv.h>
-#include <ssl.h>
-#include <err.h>
-#include <rand.h>
-#include <x509.h>
-#include <x509v3.h>
-#include <crypto.h>
-#include <engine.h>
-#include <pkcs12.h>
-
-#include <uuid/uuid.h>
-
-#include "rt_string.h"
-#include "rt_common.h"
-#include "rt_stdlib.h"
-#include "rt_file.h"
-#include "rt_time.h"
-#include "rt_tmr.h"
-#include "json.h"
-
-#include "cert_conf.h"
-#include "async.h"
-#include "read.h"
-#include "bufferevent.h"
-#include "listener.h"
-#include "libevent.h"
-#include "cert_session.h"
-#include "event_compat.h"
-#include "http.h"
-#include "buffer.h"
-#include "MESA_htable.h"
-#include "util-internal.h"
-#include "moodycamel_maat_rule.h"
-#include "moodycamel_field_stat2.h"
-#include "logging.h"
-
-#define WAIT_FOR_EFFECTIVE_US 1000*1000
-
-#define SG_DATA_SIZE 10240
-
-#define LOCAL_USER_PEN 1
-#define LOCAL_USER_DER 2
-#define LOCAL_USER_P12 3
-
-#define CM_UPDATE_TYPE_FULL 1
-#define CM_UPDATE_TYPE_INC 2
-
-static libevent_thread *threads;
-
-struct fs_stats_t{
- int line_ids[4];
- screen_stat_handle_t handle;
-};
-
-static struct fs_stats_t SGstats = {
- .line_ids = {0},
- .handle = NULL,
-};
-
-#define sizeof_seconds(x) (x * 24 * 60 * 60)
-
-void connectCallback(const struct redisAsyncContext *c, int status) {
- if (status != REDIS_OK) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Redis connect error : %s", c->errstr);
- return;
- }
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Redis server connected...");
-}
-
-void disconnectCallback(const struct redisAsyncContext *c, int status) {
- if (status != REDIS_OK) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Redis disconnect error: %s", c->errstr);
- return;
- }
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Redis server disconnected...");
-}
-
-void x509_get_private_key(EVP_PKEY *pkey, char *pubkey)
-{
- BIO *bp = NULL;
- int len = 0;
-
- if ( (bp=BIO_new(BIO_s_mem())) == NULL){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "unable to create BIO for output");
- goto finish;
- }
- PEM_write_bio_PrivateKey(bp, pkey, NULL, NULL, 0, NULL, NULL);
- len = BIO_read(bp, pubkey, SG_DATA_SIZE);
- if(len <= 0) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Error reading signature file");
- goto free_err;
- }
- pubkey[len] = '\0';
-
-free_err:
- BIO_free(bp);
-finish:
- return;
-}
-
-static
-int create_client_key(EVP_PKEY** pkey, char *pubkey, int bits)
-{
- RSA *rsa = NULL;
- EVP_PKEY *pk = NULL;
-
- if((pk = EVP_PKEY_new()) == NULL){
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "create_client_key, gen new key failed!");
- goto err;
- }
-
- rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);
- if(!EVP_PKEY_assign_RSA(pk, rsa)){
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "create_client_key, assign key failed!");
- EVP_PKEY_free(pk);
- goto err;
- }
- x509_get_private_key(pk, pubkey);
- rsa = NULL;
-
- *pkey = pk;
- return 1;
-
-err:
- return 0;
-}
-
-static X509* base_load_pkcs12(BIO *in, EVP_PKEY **pkey, X509 **x, STACK_OF(X509) **ca)
-{
- PKCS12 *p12 = NULL;
- const char *pass = "";
-
- X509 *_x = NULL;
- EVP_PKEY *_pkey;
- STACK_OF(X509) *_ca = NULL;
-
- OpenSSL_add_all_algorithms();
- ERR_load_crypto_strings();
-
- p12 = d2i_PKCS12_bio(in, NULL);
- if (p12 == NULL) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Error loading PKCS12 file");
- goto finish;
- }
- if (!PKCS12_parse(p12, pass, &_pkey, &_x, &_ca)) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Error parsing PKCS#12 file");
- goto finish;
- }
-
- if (x)
- *x = _x;
- if (pkey)
- *pkey = _pkey;
- if (ca)
- *ca = _ca;
-
- finish:
- if (p12)
- PKCS12_free(p12);
- return _x;
-}
-
-static void cert_base_load_stack_info(BIO * in_bio, STACK_OF(X509) **stack_ca)
-{
- int x509_cnt = 0;
- X509_INFO *x509_info;
- STACK_OF(X509) *stack_x509 = NULL;
- STACK_OF(X509_INFO) *stack_x509_info = NULL;
-
- if ((stack_x509 = sk_X509_new_null()) == NULL)
- {
- X509err(X509_F_X509_VERIFY_CERT, ERR_R_MALLOC_FAILURE);
- goto finish;
- }
-
- stack_x509_info = PEM_X509_INFO_read_bio(in_bio, NULL, NULL, NULL);
- if (stack_x509_info == NULL)
- {
- X509err(X509_F_X509_LOAD_CERT_CRL_FILE, ERR_R_PEM_LIB);
- goto finish;
- }
-
- while (sk_X509_INFO_num(stack_x509_info)) {
- x509_info = sk_X509_INFO_shift(stack_x509_info);
- if (x509_info->x509 != NULL) {
- sk_X509_push(stack_x509, x509_info->x509);
- x509_info->x509 = NULL;
- x509_cnt++;
- }
- X509_INFO_free(x509_info);
- }
- if (x509_cnt >= 1)
- *stack_ca = stack_x509;
-
-finish:
- if (stack_x509_info != NULL)
- sk_X509_INFO_free(stack_x509_info);
- return;
-}
-
-static X509 *
-cert_base_load_x509 (BIO * in_bio)
-{
- return PEM_read_bio_X509 (in_bio, NULL, NULL, NULL);
-}
-
-static X509 *
-cert_load_x509(char *file, STACK_OF(X509) **stack_ca)
-{
- BIO *in_bio = NULL;
- X509 *x509 = NULL;
-
- if(!file){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Input cert file is empty.");
- goto finish;
- }
-
- if ((in_bio = BIO_new(BIO_s_file())) == NULL) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Bio malloc failed.");
- goto finish;
- }
- if (BIO_read_filename(in_bio, file) <= 0) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Error opening %s", file);
- goto finish;
- }
-
- if ((x509 = cert_base_load_x509(in_bio)) == NULL){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Error loading pem file, %s",file);
- }
- cert_base_load_stack_info(in_bio, stack_ca);
-
- BIO_free (in_bio);
- in_bio = NULL;
-finish:
- return x509;
-}
-
-EVP_PKEY * cert_base_key_x509 (BIO * bio, int iFormat, char *strPwd)
-{
- EVP_PKEY *pkey = NULL;
-
- switch (iFormat){
- case LOCAL_USER_PEN:
- pkey = PEM_read_bio_PrivateKey (bio, NULL, NULL, strPwd);
- break;
- case LOCAL_USER_P12:
- base_load_pkcs12(bio, &pkey, NULL, NULL);
- break;
- default:
- break;
- }
-
- return pkey;
-}
-
-EVP_PKEY * cert_load_key(char *keyfile)
-{
- EVP_PKEY *pkey = NULL;
- BIO *in = NULL;
-
- if(!keyfile){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Input key file is empty.");
- goto finish;
- }
- if ((in = BIO_new(BIO_s_file())) == NULL) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Bio malloc failed.");
- goto finish;
- }
- if (BIO_read_filename(in, keyfile) <= 0) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Error opening %s\n", keyfile);
- goto finish;
- }
-
- if ((pkey = cert_base_key_x509 (in, LOCAL_USER_PEN, "")) != NULL)
- goto finish;
- (void)BIO_reset (in);
- if ((pkey = cert_base_key_x509 (in, LOCAL_USER_P12, "")) != NULL)
- goto finish;
-finish:
- if (in != NULL)
- BIO_free (in);
- return pkey;
-}
-
-static void key_ring_free(void *data)
-{
- struct pxy_obj_keyring *pxy_obj = NULL;
- pxy_obj = (struct pxy_obj_keyring *)data;
-
- X509_free(pxy_obj->root);
- EVP_PKEY_free(pxy_obj->key);
-}
-
-void key_ring_list_destroy(MESA_htable_handle *htable)
-{
- MESA_htable_destroy(*htable, key_ring_free);
- *htable = NULL;
- return;
-}
-
-void uuid_squeeze(char *s,int c)
-{
- int i,j;
- for (i = 0, j = 0; s[i] != '\0'; i++)
- {
- if (s[i] != c)
- {
- s[j++] = s[i];
- }
- }
- s[j] = '\0';
-}
-
-int
-ssl_x509_set_serial(ASN1_INTEGER *ai)
-{
- int ret = -1;
- uuid_t uu;
- char buf[64] = {0};
- BIGNUM *bignum = NULL;
-
- uuid_generate(uu);
- uuid_unparse(uu, buf);
- uuid_squeeze(buf, '-');
-
- BN_hex2bn(&bignum, buf);
-
- if (ai && !BN_to_ASN1_INTEGER(bignum, ai))
- goto error;
- ret = 1;
-error:
- if (bignum)
- BN_free(bignum);
- return ret;
-}
-
-int
-ssl_x509_v3ext_add(X509V3_CTX *ctx, X509 *crt, char *k, char *v)
-{
- X509_EXTENSION *ext;
-
- if (!(ext = X509V3_EXT_conf(NULL, ctx, k, v))) {
- return -1;
- }
- if (X509_add_ext(crt, ext, -1) != 1) {
- X509_EXTENSION_free(ext);
- return -1;
- }
- X509_EXTENSION_free(ext);
- return 0;
-}
-
-int
-ssl_x509_v3ext_copy_by_nid(X509 *crt, X509 *origcrt, int nid)
-{
- X509_EXTENSION *ext;
- int pos;
-
- pos = X509_get_ext_by_NID(origcrt, nid, -1);
- if (pos == -1)
- return 0;
- ext = X509_get_ext(origcrt, pos);
- if (!ext)
- return -1;
-
- if (X509_add_ext(crt, ext, -1) != 1)
- return -1;
-
- return 1;
-}
-/*
- * Add extension using V3 code: we can set the config file as NULL because we
- * wont reference any other sections.
- */
-
-int add_ext(X509 *cacrt, X509 *cert, int nid, char *value)
-{
- X509_EXTENSION *ex;
- X509V3_CTX ctx;
- /* This sets the 'context' of the extensions. */
- /* No configuration database */
- X509V3_set_ctx_nodb(&ctx);
- /*
- * Issuer and subject certs: both the target since it is self signed, no
- * request and no CRL
- */
- X509V3_set_ctx(&ctx, cacrt, cert, NULL, NULL, 0);
- ex = X509V3_EXT_conf_nid(NULL, &ctx, nid, value);
- if (!ex)
- return 0;
-
- X509_add_ext(cert, ex, -1);
- X509_EXTENSION_free(ex);
- return 1;
-}
-
-static __attribute__((__unused__)) char*
-x509_get_CrlDistPoints(X509 *x509)
-{
- int i = 0, crit = 0;
- char value[512] = {0}, *crlurl = NULL;
- CRL_DIST_POINTS *crlpoints = NULL;
-
- crlpoints = (CRL_DIST_POINTS*)X509_get_ext_d2i(x509, NID_crl_distribution_points, &crit, NULL);
- if (!crlpoints)
- goto finish;
-
- for (i = 0; i < sk_DIST_POINT_num(crlpoints); i++){
- int j, gtype;
- GENERAL_NAMES *gens;
- GENERAL_NAME *gen;
- ASN1_STRING *uri;
- DIST_POINT *dp = sk_DIST_POINT_value(crlpoints, i);
- if (!dp->distpoint || dp->distpoint->type != 0)
- continue;
- gens = dp->distpoint->name.fullname;
- for (j = 0; j < sk_GENERAL_NAME_num(gens); j++){
- gen = sk_GENERAL_NAME_value(gens, j);
- uri = (ASN1_STRING*)GENERAL_NAME_get0_value(gen, &gtype);
- if (gtype == GEN_URI && ASN1_STRING_length(uri) > 6) {
- char *uptr = (char *)ASN1_STRING_data(uri);
- if (STRLEN(value) > 0){
- STRCAT(value, " | ");
- }
- STRCAT(value, uptr);
- }
- }
- }
- CRL_DIST_POINTS_free(crlpoints);
-
- crlurl = (char *)malloc(strlen(value) + 5);
- assert(crlurl);
- sprintf(crlurl, "URI:%s", value);
-finish:
- return crlurl;
-}
-
-X509 *
-x509_modify_by_cert(X509 *cacrt, EVP_PKEY *cakey, X509 *origcrt, char *pkey,
- int days, char *crl)
-{
- int rv;
- X509 *crt = NULL;
- EVP_PKEY* key = NULL;
- X509_NAME *subject = NULL, *issuer = NULL;
-
- if(!create_client_key(&key, pkey, 1024)){
- goto err;
- }
-//subjectname,issuername
- subject = X509_get_subject_name(origcrt);
- issuer = X509_get_subject_name(cacrt);
- if (!subject || !issuer)
- return NULL;
-
- crt = X509_new();
- if (!crt)
- return NULL;
-//version,subjectname,issuername,serialnum,time,pubkey
- if (!X509_set_version(crt, 0x02) ||
- !X509_set_subject_name(crt, subject) ||
- !X509_set_issuer_name(crt, issuer) ||
- ssl_x509_set_serial(X509_get_serialNumber(crt)) == -1 ||
- !X509_gmtime_adj(X509_get_notBefore(crt), (long)(sizeof_seconds(-1))) ||
- !X509_time_adj_ex(X509_get_notAfter(crt), days, 0, NULL) ||
- !X509_set_pubkey(crt, key))
- goto errout;
-
- EVP_PKEY_free(key);
-//extensions
- X509V3_CTX ctx;
- X509V3_set_ctx(&ctx, cacrt, crt, NULL, NULL, 0);
-
- if (ssl_x509_v3ext_add(&ctx, crt, "subjectKeyIdentifier",
- "hash") == -1 ||
- ssl_x509_v3ext_add(&ctx, crt, "authorityKeyIdentifier",
- "keyid,issuer:always") == -1)
- goto errout;
-
- rv = ssl_x509_v3ext_copy_by_nid(crt, origcrt,
- NID_basic_constraints);
- if (rv == 0)
- rv = ssl_x509_v3ext_add(&ctx, crt, "basicConstraints",
- "CA:FALSE");
- if (rv == -1)
- goto errout;
-
- rv = ssl_x509_v3ext_add(&ctx, crt, "keyUsage",
- "digitalSignature,"
- "keyEncipherment");
- if (rv == -1)
- goto errout;
-
- rv = ssl_x509_v3ext_copy_by_nid(crt, origcrt,
- NID_ext_key_usage);
- if (rv == 0)
- rv = ssl_x509_v3ext_add(&ctx, crt, "extendedKeyUsage",
- "serverAuth");
- if (rv == -1)
- goto errout;
-
- if (crl != NULL && STRCMP(crl, "null")){
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Sign certificate the CRL is %s", crl);
- /**Add URI:**/
- char _crl[516] = {0};
- snprintf(_crl, 516, "%s%s", "URI:", crl);
- if (ssl_x509_v3ext_add(&ctx, crt, "crlDistributionPoints",
- _crl) == -1) {
- goto errout;
- }
- }
- /* no extraname provided: copy original subjectAltName ext */
- if (ssl_x509_v3ext_copy_by_nid(crt, origcrt,
- NID_subject_alt_name) == -1)
- {
- goto errout;
- }
-#ifdef DEBUG_CERTIFICATE
- ssl_x509_v3ext_add(&ctx, crt, "nsComment", "Generated by " PKGLABEL);
-#endif /* DEBUG_CERTIFICATE */
-
- const EVP_MD *md;
- switch (EVP_PKEY_type(EVP_PKEY_base_id(cakey))) {
-#ifndef OPENSSL_NO_RSA
- case EVP_PKEY_RSA:
- switch (X509_get_signature_nid(origcrt)) {
- case NID_md5WithRSAEncryption:
- md = EVP_md5();
- break;
- case NID_ripemd160WithRSA:
- md = EVP_ripemd160();
- break;
- case NID_sha1WithRSAEncryption:
- md = EVP_sha1();
- break;
- case NID_sha224WithRSAEncryption:
- md = EVP_sha224();
- break;
- case NID_sha256WithRSAEncryption:
- md = EVP_sha256();
- break;
- case NID_sha384WithRSAEncryption:
- md = EVP_sha384();
- break;
- case NID_sha512WithRSAEncryption:
- md = EVP_sha512();
- break;
-#ifndef OPENSSL_NO_SHA0
- case NID_shaWithRSAEncryption:
- md = EVP_sha();
- break;
-#endif /* !OPENSSL_NO_SHA0 */
- default:
- md = EVP_sha256();
- break;
- }
- break;
-#endif /* !OPENSSL_NO_RSA */
-#ifndef OPENSSL_NO_DSA
- case EVP_PKEY_DSA:
- switch (X509_get_signature_nid(origcrt)) {
- case NID_dsaWithSHA1:
- case NID_dsaWithSHA1_2:
- md = EVP_sha1();
- break;
- case NID_dsa_with_SHA224:
- md = EVP_sha224();
- break;
- case NID_dsa_with_SHA256:
- md = EVP_sha256();
- break;
-#ifndef OPENSSL_NO_SHA0
- case NID_dsaWithSHA:
- md = EVP_sha();
- break;
-#endif /* !OPENSSL_NO_SHA0 */
- default:
- md = EVP_sha256();
- break;
- }
- break;
-#endif /* !OPENSSL_NO_DSA */
-#ifndef OPENSSL_NO_ECDSA
- case EVP_PKEY_EC:
- switch (X509_get_signature_nid(origcrt)) {
- case NID_ecdsa_with_SHA1:
- md = EVP_sha1();
- break;
- case NID_ecdsa_with_SHA224:
- md = EVP_sha224();
- break;
- case NID_ecdsa_with_SHA256:
- md = EVP_sha256();
- break;
- case NID_ecdsa_with_SHA384:
- md = EVP_sha384();
- break;
- case NID_ecdsa_with_SHA512:
- md = EVP_sha512();
- break;
- default:
- md = EVP_sha256();
- break;
- }
- break;
-#endif /* !OPENSSL_NO_ECDSA */
- default:
- goto errout;
- }
- if (!X509_sign(crt, cakey, md))
- goto errout;
-
- return crt;
-errout:
- X509_free(crt);
- EVP_PKEY_free(key);
-err:
- return NULL;
-}
-
-void x509_get_msg_from_ca(X509 *x509, char **root)
-{
- BIO *bp = NULL;
- int len = 0;
-
- if ( (bp=BIO_new(BIO_s_mem())) == NULL){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "unable to create BIO for output");
- goto finish;
- }
- PEM_write_bio_X509(bp, x509);
-
- char *p = NULL;
- len = BIO_get_mem_data(bp, &p);
- *root = (char*)malloc(len + 1);
- memset(*root, 0, len + 1);
-
- len = BIO_read(bp, *root, len);
- if(len <= 0) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Error reading signature file");
- goto err;
- }
-err:
- BIO_free(bp);
-finish:
- return;
-}
-
-X509 *
-x509_get_ca_from_msg(const char *cert, int len)
-{
- BIO *bp;
- char *in = NULL;
- X509* x509 = NULL;
-
- in = (char *)kmalloc(len, MPF_CLR, -1);
- assert(in);
-
- strncpy(in, cert, len);
-
- if ( (bp=BIO_new(BIO_s_mem())) == NULL){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "unable to create BIO for output");
- goto finish;
- }
- BIO_printf(bp, "%s", in);
- x509 = PEM_read_bio_X509(bp, NULL, NULL, NULL);
- if(NULL == x509) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to read pem file");
- goto err;
- }
-err:
- BIO_free(bp);
-finish:
- free(in);
- return x509;
-}
-
-static
-int redis_rsync_init(struct event_base *base, struct redisAsyncContext **cl_ctx)
-{
- int xret = -1;
- struct config_bucket_t *redis = cert_default_config();
-
- *cl_ctx = redisAsyncConnect(redis->addr_t.store_ip, redis->addr_t.store_port);
- if((*cl_ctx)->err ) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Redis Connect error : %s", (*cl_ctx)->errstr);
- goto finish;
- }
- redisLibeventAttach((*cl_ctx), base);
- redisAsyncSetConnectCallback((*cl_ctx), connectCallback);
- redisAsyncSetDisconnectCallback((*cl_ctx), disconnectCallback);
-
- xret = 0;
-
-finish:
- return xret;
-}
-
-/* Callback used for the /dump URI, and for every non-GET request:
- * dumps all information to stdout and gives back a trivial 200 ok */
-static int
-evhttp_socket_send(struct evhttp_request *req, char *sendbuf)
-{
- struct evbuffer *evb = NULL;
-
- /* This holds the content we're sending. */
- evb = evbuffer_new();
-
- if (sendbuf[0] == '\0' && req == NULL){
- goto err;
- }
- evhttp_add_header(evhttp_request_get_output_headers(req),
- "Content-Type", "test");
- evbuffer_add_printf(evb, "%s", sendbuf);
- evhttp_send_reply(req, HTTP_OK, "OK", evb);
- goto done;
-
-err:
- evhttp_send_error(req, HTTP_NOTFOUND, "Document was not found");
-done:
- evbuffer_free(evb);
- return 0;
-}
-
-static void
-redis_reget_callback(redisAsyncContext __attribute__((__unused__))*cl_ctx,
- void *r, void *privdata)
-{
- redisReply *reply = (redisReply*)r;
-
- struct request_t *request = (struct request_t *)privdata;
-
- struct evhttp_request *evh_req = request->evh_req;
-
- evhttp_socket_send(evh_req, reply->str);
-
- kfree(request->odata);
- kfree(request);
- return;
-}
-
-void keyring_table_free_cb(int __attribute__((__unused__))table_id, MAAT_PLUGIN_EX_DATA* ad,
-long __attribute__((__unused__))argl, void __attribute__((__unused__))*argp)
-{
- if (*ad == NULL)
- return;
-
- struct pxy_obj_keyring* pxy_obj=(struct pxy_obj_keyring*)(*ad);
- atomic64_dec(&pxy_obj->ref_cnt);
- if (atomic64_read(&pxy_obj->ref_cnt) == 0)
- {
- if (pxy_obj->root)
- X509_free(pxy_obj->root);
- if (pxy_obj->key)
- EVP_PKEY_free(pxy_obj->key);
- free(pxy_obj);
- pxy_obj = NULL;
- *ad=NULL;
- }
-}
-
-void keyring_table_free(struct pxy_obj_keyring* pxy_obj)
-{
- keyring_table_free_cb(0, (void **)&pxy_obj, 0, NULL);
-}
-
-int add_cert_ctx(X509_NAME* name, char* ctx[], int num)
-{
- int i = 0;
- int max = 0;
-
- int item[] = {NID_commonName, NID_countryName,
- NID_stateOrProvinceName, NID_localityName,
- NID_organizationName, NID_organizationalUnitName,
- NID_pkcs9_emailAddress};
-
- max = sizeof(item)/sizeof(item[0]);
- max = max > num ? num : max;
-
- for(i = 0; i< max; ++i){
- if(!X509_NAME_add_entry_by_NID(name, item[i], MBSTRING_UTF8, (unsigned char *)ctx[i], -1, -1, 0)){
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "add_cert_ctx, add entry:%d to %s failed!", item[i], ctx[i]);
- return 0;
- }
- }
-
- return 1;
-}
-
-int rand_serial(BIGNUM *b, ASN1_INTEGER *ai)
-{
-#define SERIAL_RAND_BITS 124
- BIGNUM *btmp;
- int ret = 0;
- if (b)
- btmp = b;
- else
- btmp = BN_new();
- if (!btmp)
- return 0;
- if (!BN_pseudo_rand(btmp, SERIAL_RAND_BITS, 0, 0))
- goto error;
- if (ai && !BN_to_ASN1_INTEGER(btmp, ai))
- goto error;
- ret = 1;
-
- error:
- if (!b)
- BN_free(btmp);
- return ret;
-}
-
-X509 *x509_modify_by_cert_bak(X509 *cacrt, EVP_PKEY *cakey, const char* host,
- char *pubkey, const int days)
-{
- X509* x = NULL;
- EVP_PKEY* pk = NULL;
-
- char* ctx[] = {(char*)host, "CN", "mystate",
- "mycity", "myorganization", "mygroup",
-
- if(!create_client_key(&pk, pubkey, 1024)){
- goto err;
- }
-
- if((x = X509_new()) == NULL){
- goto err;
- }
-
- if (!X509_set_version(x, 0x02)){
- goto err;
- }
-
- if (!X509_set_version(x, 0x02) ||
- !X509_set_issuer_name(x, X509_get_subject_name(cacrt)) ||
- !rand_serial(NULL, X509_get_serialNumber(x)) ||
- !X509_gmtime_adj(X509_get_notBefore(x), 0L) ||
- !X509_time_adj_ex(X509_get_notAfter(x), days, 0, NULL) ||
- !X509_set_pubkey(x, pk) ||
- !add_cert_ctx(X509_get_subject_name(x), ctx, 7))
- goto err;
-#if 1
-
- /* Add various extensions: standard extensions */
- add_ext(cacrt, x, NID_basic_constraints, "critical,CA:FALSE");
- add_ext(cacrt, x, NID_subject_key_identifier, "hash");
- add_ext(cacrt, x, NID_key_usage, "Digital Signature, Key Encipherment, Data Encipherment");
-
- /**/
-
- add_ext(cacrt, x, NID_authority_key_identifier, "keyid:always");
-
- add_ext(cacrt, x, NID_ext_key_usage, "serverAuth,clientAuth");
- /*NID_certificate_policies*/
-/*
- char dns[128] = {0}, domain[16] = {0};
- sscanf(host, "%*[^.].%[^.]", domain);
- snprintf(dns, 127, "DNS:%s.com, DNS:*.%s.com, DNS:www.%s.cn", domain, domain, domain);
- add_ext(cacrt, x, NID_subject_alt_name, dns);
-*/
-#endif
- if(!X509_sign(x, cakey, EVP_sha256())){
- goto err;
- }
- return x;
-
-err:
- if(x)
- X509_free(x);
- if(pk)
- EVP_PKEY_free(pk);
- return NULL;
-}
-
-char *x509_get_sn(X509 *x509)
-{
- ASN1_INTEGER *asn1_i = NULL;
- BIGNUM *bignum = NULL;
- char *serial = NULL;
-
- asn1_i = X509_get_serialNumber(x509);
- bignum = ASN1_INTEGER_to_BN(asn1_i, NULL);
- if (bignum == NULL) {
- goto finish;
- }
- serial = BN_bn2hex(bignum);
- if (serial == NULL) {
- goto finish;
- }
- BN_free(bignum);
-finish:
- return serial;
-}
-
-static struct pxy_obj_keyring* get_obj_for_id(int keyring_id)
-{
- struct pxy_obj_keyring *pxy_obj=NULL;
-
- struct config_bucket_t *rte = cert_default_config();
-
- char cfg_id_str[16] = {0};
- snprintf(cfg_id_str, sizeof(cfg_id_str), "%d", keyring_id);
-
- int tables_id = rte->table_id;
- pxy_obj = (struct pxy_obj_keyring*)maat_plugin_get_EX_data(rte->feather, tables_id, (const char*)cfg_id_str);
- return pxy_obj;
-}
-
-static int x509_online_append(struct x509_object_ctx *def, struct request_t *request,
- char **root, char **sign, char *pkey,
- STACK_OF(X509) **stack_ca)
-{
- X509* x509 = NULL;
- int is_valid = request->is_valid;
- int keyring_id = request->keyring_id;
- int _expire = 0; char *_crl = NULL;
- char *serial = NULL;
- X509 *_root = NULL; EVP_PKEY *_key = NULL;
-
- struct config_bucket_t *rte = cert_default_config();
-
- if (is_valid == 0 && keyring_id != 0) keyring_id = 0;
- if (is_valid == 1 && keyring_id == 0) keyring_id = 1;
-
- struct pxy_obj_keyring *pxy_obj = get_obj_for_id(keyring_id);
- if (NULL == pxy_obj)
- {
- if (!rte->local_debug)
- {
- if (1==is_valid)
- {
- pxy_obj = get_obj_for_id(1);
- }
- if (0==is_valid)
- {
- pxy_obj = get_obj_for_id(0);
- }
- assert(pxy_obj!=NULL);
- mesa_runtime_log(RLOG_LV_DEBUG, MODULE_NAME, "Certificate issued by table id %d", keyring_id);
- }
- else
- {
- _root = (is_valid == 1) ? def->root : def->insec_root;
- _key = (is_valid == 1) ? def->key : def->insec_key;
- _expire = cert_default_config()->expire_after;
- mesa_runtime_log(RLOG_LV_DEBUG, MODULE_NAME, "Certificate issued by local cert");
- goto modify;
- }
- }
- if (!STRCMP(pxy_obj->keyring_type, "end-entity"))
- {
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "The certificate(%d) type is an entity certificate",
- keyring_id);
- *stack_ca = pxy_obj->stack_ca;
- x509_get_msg_from_ca(pxy_obj->root, sign);
- x509_get_private_key(pxy_obj->key, pkey);
- goto finish;
- }
- if (!STRCMP(pxy_obj->keyring_type, "intermediate"))
- {
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "The certificate(%d) type is intermediate, chain address %p",
- keyring_id, pxy_obj->stack_ca);
- *stack_ca = pxy_obj->stack_ca;
- }
- _root = pxy_obj->root;
- _key = pxy_obj->key;
- _expire = pxy_obj->expire_after;
- _crl = pxy_obj->v3_ctl;
-modify:
- x509 = x509_modify_by_cert(_root, _key, request->origin, pkey,
- _expire, _crl);
- if (!x509){
- goto finish;
- }
-
- serial = x509_get_sn(x509);
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "The certificate serial number is %s", serial);
- OPENSSL_free(serial);
-
- x509_get_msg_from_ca(x509, sign);
- x509_get_msg_from_ca(_root, root);
-
- if (request->origin)
- X509_free(request->origin);
- X509_free(x509);
-finish:
- if (pxy_obj)
- keyring_table_free(pxy_obj);
- return _expire;
-}
-
-static char readBytes(char *str)
-{
- char c;
-
- if (str && STRCMP(str, "OK") == 0)
- c = '+';
- if (!str)
- c= '$';
-
- return c;
-}
-
-static int
-rediSyncCommand(redisAsyncContext *cl_ctx, struct request_t *request,
- char *odata, uint64_t expire_after)
-{
- int xret = -1;
- redisReply *reply;
-
- libevent_thread *thread = threads + request->thread_id;
- struct evhttp_request *evh_req = request->evh_req;
-
- reply = (redisReply *)redisCommand(thread->sync, "set %s %s ex %d nx", request->rkey, odata,
- sizeof_seconds(expire_after));
- if (NULL == reply)
- goto free;
-
- switch (readBytes(reply->str)) {
- case '+' :
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Writing data(%s) to redis successfully", request->rkey);
- FS_internal_operate(SGstats.handle, thread->column_ids, SGstats.line_ids[2], FS_OP_ADD, 1);
-
- evhttp_socket_send(evh_req, request->odata);
- goto free;
- case '$' :
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Writing data(%s) to redis failed", request->rkey);
- FS_internal_operate(SGstats.handle, thread->column_ids, SGstats.line_ids[1], FS_OP_ADD, 1);
-
- redisAsyncCommand(cl_ctx, redis_reget_callback, request, "GET %s", request->rkey);
- freeReplyObject(reply);
- goto finish;
- default :
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Read redis data(%s) return code failed", request->rkey);
- evhttp_send_error(request->evh_req, HTTP_NOTFOUND, 0);
- goto free;
- }
- xret = 0;
-
-free:
- freeReplyObject(reply);
- kfree(request->odata);
- kfree(request);
-
-finish:
- return xret;
-}
-
-static inline json_object *
-web_json_record_array_add_string(char **chain)
-{
- int i;
- json_object *sample_array;
-
- sample_array = json_object_new_array();
- if (sample_array == NULL)
- goto finish;
-
- for(i = 0; chain[i] != '\0'; i++){
- json_object_array_add(sample_array, json_object_new_string(chain[i]));
- }
-finish:
- return sample_array;
-}
-
-static inline int
-json_data_rebuild(const char *data,
- size_t size,
- char **odata,
- size_t *osize)
-{
- size_t real_size = size + 1; /** 2, '\n' + '\0' */
-
- if (!data || !size)
- return -1;
-
- *odata = malloc (real_size);
- if (!*odata)
- return -1;
- memset (*odata, 0, real_size);
- snprintf(*odata, real_size, "%s", data);
-
- *osize = real_size;
-
- return 0;
-}
-
-static int
-web_json_table_add(char *privatekey, char *sign,
- char **chain, char **data)
-{
- int i = 0;
- size_t osize = 0;
- const char *jstr = NULL;
- struct json_object *outline = json_object_new_object();
-
- json_object_object_add(outline, "CERTIFICATE_CHAIN", web_json_record_array_add_string(chain));
- json_object_object_add(outline, "PRIVATE_KEY", json_object_new_string(privatekey));
- json_object_object_add(outline, "CERTIFICATE", json_object_new_string(sign));
-
- jstr = json_object_to_json_string (outline);
-
- json_data_rebuild(jstr, strlen(jstr), data, &osize);
-
- json_object_put(outline);
-
- kfree(sign);
- for (i = 0; i < 6; i ++){
- if (chain[i] != NULL)
- kfree(chain[i]);
- }
- return 0;
-}
-
-static int
-redis_clnt_pdu_send(struct request_t *request, redisAsyncContext *c)
-{
-#define MAX_CHAIN_LEN 6
- int xret = -1, i = 0;
- int expire_after;
- STACK_OF(X509) *stack_ca = NULL;
- libevent_thread *info = threads + request->thread_id;
- char *sign = NULL, pkey[SG_DATA_SIZE] = {0};
- char *root = NULL;
-
- expire_after = x509_online_append(&info->def, request, &root, &sign, pkey, &stack_ca);
- if (sign == NULL && pkey[0] == '\0'){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to sign certificate");
- evhttp_send_error(request->evh_req, HTTP_NOTFOUND, 0);
- goto finish;
- }
- FS_internal_operate(SGstats.handle, info->column_ids, SGstats.line_ids[3], FS_OP_SET, info->diffTime);
- FS_internal_operate(SGstats.handle, info->field_ids, 0, FS_OP_ADD, 1);
-
- char *single = NULL;
- char *chain[MAX_CHAIN_LEN] = {0};
- if (stack_ca){
- for (i = 0; i < sk_X509_num(stack_ca); i++){
- x509_get_msg_from_ca(sk_X509_value(stack_ca, i), &single);
- chain[i] = single;
- }
- if (root != NULL){
- chain[i] = root;
- i++;
- }
- }else{
- chain[0] = root;
- }
-
- web_json_table_add(pkey, sign, chain, &request->odata);
-
- if (NULL == c){
- struct evhttp_request *evh_req = request->evh_req;
- FS_internal_operate(SGstats.handle, info->column_ids, SGstats.line_ids[2], FS_OP_ADD, 1);
- evhttp_socket_send(evh_req, request->odata);
- kfree(request->odata);
- kfree(request);
- xret = 0;
- goto finish;
- }
-
- xret = rediSyncCommand(c, request, request->odata, expire_after);
- if (xret < 0){
- goto finish;
- }
- xret = 0;
-finish:
- return xret;
-}
-
-static int
-redis_clnt_send(struct request_t *request, redisReply *reply)
-{
- int xret = -1;
-
- libevent_thread *thread = threads + request->thread_id;
-
- if (!reply && !reply->str){
- evhttp_send_error(request->evh_req, HTTP_NOTFOUND, 0);
- goto finish;
- }
-
- FS_internal_operate(SGstats.handle, thread->column_ids, SGstats.line_ids[1], FS_OP_ADD, 1);
-
- FS_internal_operate(SGstats.handle, thread->field_ids, 0, FS_OP_ADD, 1);
-
- evhttp_socket_send(request->evh_req, reply->str);
-
-finish:
- if (request->origin)
- X509_free(request->origin);
- kfree(request);
- return xret;
-}
-
-void redis_get_callback(redisAsyncContext *c, void *r, void *privdata)
-{
- int __attribute__((__unused__))xret = -1;
-
- redisReply *reply = (redisReply*)r;
- struct request_t *request = (struct request_t *)privdata;
-
- switch(reply->type){
- case REDIS_REPLY_STRING:
- mesa_runtime_log(RLOG_LV_DEBUG, MODULE_NAME, "Sends the certificate information to the requestor");
-
- xret = redis_clnt_send(request, reply);
- break;
-
- case REDIS_REPLY_NIL:
- mesa_runtime_log(RLOG_LV_DEBUG, MODULE_NAME, "Generating certificate information");
-
- xret = redis_clnt_pdu_send(request, c);
- break;
- default:
- break;
- }
- return;
-}
-
-int x509_key_pair_init(char *ca_file, EVP_PKEY **key, X509 **root)
-{
- int xret = -1;
- FILE *fp; RSA *rsa = NULL;
-
- *key = EVP_PKEY_new();
- if (NULL == *key){
- goto finish;
- }
-
- rsa = RSA_new();
- if (NULL == rsa){
- goto pkey_free;
- }
-
- fp = fopen(ca_file, "r");
- if (NULL == fp){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to open file(%s)", ca_file);
- RSA_free(rsa);
- goto pkey_free;
- }
- if ( !PEM_read_RSAPrivateKey(fp, &rsa, NULL, NULL) || !EVP_PKEY_assign_RSA(*key,rsa))
- {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Private key read failed");
- goto pkey_free;
- }
- fclose(fp);
-
- BIO *in;
- in = BIO_new_file(ca_file, "r");
- if (!in){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to open file(%s)", ca_file);
- goto pkey_free;
- }
-
- if ((*root = PEM_read_bio_X509(in, NULL, 0, NULL)) == NULL )
- {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Application for x509 failed");
- goto pkey_free;
- }
- BIO_free(in);
-
- xret = 0;
- goto finish;
-
-pkey_free:
- EVP_PKEY_free(*key);
-finish:
- return xret;
-}
-
-int hex2dec(char c)
-{
- if ('0' <= c && c <= '9') {
- return c - '0';
- } else if ('a' <= c && c <= 'f') {
- return c - 'a' + 10;
- } else if ('A' <= c && c <= 'F') {
- return c - 'A' + 10;
- } else {
- return -1;
- }
-}
-
-void _urldecode(char url[])
-{
- int i = 0;
- int len = strlen(url);
- int res_len = 0;
- char *res = NULL;
-
- res = (char *)malloc(len + 1);
- if (!res){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Url alloc faild");
- return;
- }
-
- if(!strchr(url, '%'))
- return;
-
- for (i = 0; i < len; ++i) {
- char c = url[i];
- if (c != '%') {
- res[res_len++] = c;
- } else {
- char c1 = url[++i];
- char c0 = url[++i];
- int num = 0;
- num = hex2dec(c1) * 16 + hex2dec(c0);
- res[res_len++] = num;
- }
- }
- res[res_len] = '\0';
- strcpy(url, res);
-
- free(res);
-}
-
-static char*
-decode_capture(const char *uri, const char *key)
-{
- int size = 0;
- char *origin_uri = NULL;
-
- char *urlecode = STRSTR(uri, key);
- if (!urlecode){
- size = 0;
- }else{
- size = strlen(urlecode);
- }
- int len = strlen(uri) - size;
- origin_uri = (char *)malloc(len + 1);
- memcpy(origin_uri, uri, len);
-
- return origin_uri;
-}
-
-static char*
-decode_origin_cert(const char *uri, const char *key)
-{
- char *origin = NULL;
-
- char *urlecode = STRSTR(uri, key);
- if (!urlecode){
- goto finish;
- }
- origin = urlecode + 12;
- _urldecode(origin);
-finish:
- return origin;
-}
-
-static int
-thread_decode_uri(const char *uri, X509 **origin,
- int *keyring_id, char *sni, int *is_valid)
-{
- const char *_origin = NULL, *id = NULL;
- const char *_sni = NULL, *_valid = NULL;
- char *decoded_uri = NULL, *ecode_uri = NULL;
- struct evkeyvalq params;
-
- decoded_uri = evhttp_decode_uri(ecode_uri = decode_capture(uri, "origin_cert"));
- if (!decoded_uri){
- goto finish;
- }
- evhttp_parse_query(uri, &params);
- id = evhttp_find_header(&params, "keyring_id");
- if (id)
- *keyring_id = atoi(id);
- _valid = evhttp_find_header(&params, "is_valid");
- if (_valid)
- *is_valid = atoi(_valid);
- _sni = evhttp_find_header(&params, "sni");
- if (_sni)
- memcpy(sni, _sni, strlen(_sni));
-
- _origin = decode_origin_cert(uri, "origin_cert");
- if (_origin)
- *origin = x509_get_ca_from_msg(_origin, STRLEN(_origin) + 1);
-
- evhttp_clear_headers(&params);
- free(decoded_uri);
-
-finish:
- free(ecode_uri);
- return 0;
-}
-
-static void
-evhttp_socket_close_cb(struct evhttp_connection *evcon,
- void __attribute__((__unused__))*arg)
-{
- if (NULL == evcon){
- goto finish;
- }
-
-finish:
- return;
-}
-
-static int
-x509_get_rkey(X509 *origin, int keyring_id, char *rkey, int is_valid)
-{
- unsigned int len = 0, i = 0;
- char hex[EVP_MAX_MD_SIZE] = {0};
- unsigned char fdig[EVP_MAX_MD_SIZE] = {0};
-
- X509_digest(origin, EVP_sha1(), fdig, &len);
- for (i = 0; i < len ; ++i){
- sprintf(hex + i * sizeof(unsigned char) * 2, "%02x", fdig[i]);
- }
- /** keyrind_id is 0, sign x509 by default */
- /** 0 uninsec, 1 insec*/
- if (is_valid && keyring_id == 0) keyring_id = 1;
-
- struct pxy_obj_keyring *pxy_obj = get_obj_for_id(keyring_id);
- if (pxy_obj != NULL)
- {
- snprintf(rkey, DATALEN, "%d:%s:%s:%d", keyring_id, hex, pxy_obj->finger, is_valid);
- goto finish;
- }
- snprintf(rkey, DATALEN, "%d:%s:%d", keyring_id, hex, is_valid);
-finish:
- return 0;
-}
-
-void
-pthread_work_proc(struct evhttp_request *evh_req, void *arg)
-{
- int xret = -1;
- const char *cmdtype = NULL;
- struct request_t *request = NULL;
- struct evhttp_uri *decoded = NULL;
- libevent_thread *info = (libevent_thread *)arg;
-
- /* we want to know if this connection closes on us */
- evhttp_connection_set_closecb(evhttp_request_get_connection(evh_req), evhttp_socket_close_cb, NULL);
-
- const char *uri = evhttp_request_get_uri(evh_req);
- /* Decode the URI */
- decoded = evhttp_uri_parse(uri);
- if (!decoded) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "It's not a good URI. Sending BADREQUEST");
- goto error;
- }
-
- request = (struct request_t *) kmalloc (sizeof(struct request_t), MPF_CLR, -1);
- if (request != NULL){
- memset(request, 0, sizeof(struct request_t));
- request->keyring_id = 0;
- request->thread_id = info->id;
- request->evh_req = evh_req;
- }
- switch (evhttp_request_get_command(evh_req)) {
- case EVHTTP_REQ_GET: cmdtype = "GET"; break;
- default: cmdtype = "unknown"; break;
- }
- FS_internal_operate(SGstats.handle, info->column_ids, SGstats.line_ids[0], FS_OP_ADD, 1);
-
- thread_decode_uri(uri, &request->origin, &request->keyring_id, request->sni,
- &request->is_valid);
-
- mesa_runtime_log(RLOG_LV_DEBUG, MODULE_NAME, "[Thread %d]Received a %s request for uri, kering_id:%d, sni:%s origin:%p valid:%d",
- request->thread_id, cmdtype, request->keyring_id, request->sni, request->origin, request->is_valid);
-
- if (request->origin == NULL || !request->evh_req){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to resolve the request url");
- kfree(request);
- evhttp_uri_free(decoded);
- goto error;
- }
-
- x509_get_rkey(request->origin, request->keyring_id, request->rkey, request->is_valid);
- if (request->rkey[0] == '\0'){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Get the redis key from the certificate failed");
- goto error;
- }
- mesa_runtime_log(RLOG_LV_DEBUG, MODULE_NAME, "Redis key is %s", request->rkey);
-
- if (info->cl_ctx->err != 0){
- xret = redis_clnt_pdu_send(request, NULL);
- if (xret < 0)
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Local sign certificate failed");
- goto free;
- }else{
- xret = redisAsyncCommand(info->cl_ctx, redis_get_callback, request, "GET %s", request->rkey);
- if (xret < 0)
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to get information from redis server");
- }
-free:
- evhttp_uri_free(decoded);
- goto finish;
-
-error:
- evhttp_send_error(evh_req, HTTP_BADREQUEST, 0);
-finish:
- return;
-}
-
-int redis_sync_init(struct redisContext **c)
-{
- int xret = -1;
- struct config_bucket_t *redis = cert_default_config();
-
- struct timeval timeout = { 1, 500000 }; // 1.5 seconds
-
- *c = redisConnectWithTimeout(redis->addr_t.store_ip, redis->addr_t.store_port, timeout);
- if (*c == NULL || (*c)->err) {
- if (*c) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Sync connection error: %s", (*c)->errstr);
- redisFree(*c);
- *c = NULL;
- } else {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Connection error: can't allocate redis context");
- }
- goto finish;
- }
- xret = 0;
-finish:
- return xret;
-}
-
-static int
-task_private_init(struct event_base *base, libevent_thread *info)
-{
- int xret = -1;
- struct config_bucket_t *config = cert_default_config();
-
- /* Initialize the redis connection*/
- xret = redis_rsync_init(base, &info->cl_ctx);
- if (xret < 0 || !info->cl_ctx){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Initialize the redis connection is failure");
- }
-
- xret = redis_sync_init(&info->sync);
- if (xret < 0 || !info->sync){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Initialize the sync redis connection is failure");
- }
-
- if (config->local_debug)
- {
- /* Initialize the X509 CA*/
- xret = x509_key_pair_init(config->ca_path, &info->def.key, &info->def.root);
- if (xret < 0 || !(info->def.key) || !(info->def.root)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to initialize the x509 certificate");
- goto finish;
- }
-
- /* Initialize the insec CA*/
- xret = x509_key_pair_init(config->uninsec_path, &info->def.insec_key, &info->def.insec_root);
- if (xret < 0 || !(info->def.key) || !(info->def.root)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to initialize the insec x509 certificate");
- goto finish;
- }
- }
-finish:
- return xret;
-}
-
-static void *pthread_worker_libevent(void *arg)
-{
- int xret = -1;
- struct evhttp *http = NULL;
- struct event_base *base = NULL;
- struct evhttp_bound_socket *bound = NULL;
-
- libevent_thread *thread = (libevent_thread *)arg;
-
- base = event_base_new();
- if (! base) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Can'thread allocate event base");
- goto finish;
- }
-
- http = evhttp_new(base);
- if (!http) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "couldn'thread create evhttp. Exiting.");
- goto error;
- }
- thread->base = base;
-
- /* Context initialization */
- xret = task_private_init(base, thread);
- if (xret < 0){
- goto error;
- }
- evhttp_set_cb(http, "/ca", pthread_work_proc, thread);
-
- bound = evhttp_accept_socket_with_handle(http, thread->accept_fd);
- if (bound != NULL) {
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Bound(%p) to port %d - Awaiting connections ... ", bound,
- cert_default_config()->addr_t.e_port);
- }
-
- event_base_dispatch(base);
-error:
- event_base_free(base);
-finish:
- return NULL;
-}
-
-static evutil_socket_t
-evhttp_listen_socket_byuser(const struct sockaddr *sa, int socklen,
- unsigned flags, int backlog)
-{
- evutil_socket_t fd;
- int on = 1;
- int family = sa ? sa->sa_family : AF_UNSPEC;
- int socktype = SOCK_STREAM | EVUTIL_SOCK_NONBLOCK;
-
- if (flags & LEV_OPT_CLOSE_ON_EXEC)
- socktype |= EVUTIL_SOCK_CLOEXEC;
-
- fd = evutil_socket_(family, socktype, 0);
- if (fd == -1)
- return fd;
-
- if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on))<0)
- goto err;
- if (flags & LEV_OPT_REUSEABLE) {
- if (evutil_make_listen_socket_reuseable(fd) < 0)
- goto err;
- }
- if (flags & LEV_OPT_REUSEABLE_PORT) {
- if (evutil_make_listen_socket_reuseable_port(fd) < 0){
- goto err;
- }
- }
- if (sa) {
- if (bind(fd, sa, socklen)<0)
- goto err;
- }
- if (listen(fd, backlog) == -1) {
- goto err;
- }
- return fd;
-err:
- evutil_closesocket(fd);
- return fd;
-}
-
-static int
-fs_screen_preview(libevent_thread *thread)
-{
- char buff[128] = {0};
-
- snprintf(buff, sizeof(buff),"Thread_%02d", thread->id);
- thread->field_ids = FS_internal_register(SGstats.handle, FS_STYLE_FIELD, FS_CALC_CURRENT, buff);
-
- snprintf(buff, sizeof(buff),"Thread_%d", thread->id);
- thread->column_ids = FS_internal_register(SGstats.handle, FS_STYLE_LINE, FS_CALC_CURRENT, buff);
-
- return 0;
-}
-
-static void
-redis_link_detection(uint32_t __attribute__((__unused__)) uid,
- int __attribute__((__unused__))argc,
- char **argv)
-{
- int tid = 0, xret = 0;
- libevent_thread *info = NULL;
- libevent_thread *threads = (libevent_thread *)argv;
-
- unsigned int thread_nu = cert_default_config()->thread_nu;
- for (tid = 0; tid < (int)thread_nu; tid++) {
- info = threads + tid;
- if(info->cl_ctx->err != 0){
- if (info->sync)
- redisFree(info->sync);
-
- xret = redis_sync_init(&info->sync);
- if (xret < 0 || !info->sync){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "[%d]trying to connect sync redis failed", tid);
- continue;
- }else{
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "[%d]trying to connect sync redis success", tid);
- }
-
- xret = redis_rsync_init(info->base, &info->cl_ctx);
- if (xret < 0 || !info->cl_ctx){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "[%d]trying to connect rsync redis failed", tid);
- }else{
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "[%d]trying to connect rsync redis success", tid);
- }
- }
- }
-}
-
-static int
-libevent_socket_init()
-{
- struct sockaddr_in sin;
- evutil_socket_t accept_fd = -1;
- int xret = -1;
- unsigned int tid = 0;
- libevent_thread *thread = NULL;
-
- unsigned int thread_nu = cert_default_config()->thread_nu;
-
- /* Create a new evhttp object to handle requests. */
- memset(&sin, 0, sizeof(struct sockaddr_in));
- sin.sin_family = AF_INET;
- sin.sin_port = htons(cert_default_config()->addr_t.e_port);
- accept_fd = evhttp_listen_socket_byuser((struct sockaddr*)&sin, sizeof(struct sockaddr_in),
- LEV_OPT_REUSEABLE_PORT|LEV_OPT_CLOSE_ON_FREE, -1);
- if (accept_fd < 0) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Could not create a listen!");
- goto finish;
- }
- threads = calloc(thread_nu, sizeof(libevent_thread));
- if (! threads) {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Can't allocate thread descriptors");
- goto finish;
- }
- memset(threads, 0, thread_nu * sizeof(libevent_thread));
-
- /* Create threads after we've done all the libevent setup. */
- for (tid = 0; tid < thread_nu; tid++) {
- thread = threads + tid;
-
- thread->id = tid;
- thread->accept_fd = accept_fd;
- thread->routine = pthread_worker_libevent;
-
- fs_screen_preview(thread);
- if (pthread_create(&thread->pid, thread->attr, thread->routine, &threads[tid])){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "%s", strerror(errno));
- goto finish;
- }
- if (pthread_detach(thread->pid)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "%s", strerror(errno));
- goto finish;
- }
- }
-#ifdef RT_TMR_ADVANCED
- /*Create timers to monitor redis connections **/
- uint32_t tm_link_detetion = 0;
- tm_link_detetion = tmr_create(1, "Redis link detection",
- redis_link_detection, 1, (char **)threads, 5);
- if (((int32_t)tm_link_detetion < 0)){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "%s",
- "Can not create link-detection timer for redis\n");
- }
- tmr_start(tm_link_detetion);
-#endif
- FOREVER{
- sleep(1);
- }
-finish:
- return xret;
-}
-
-static void
-rt_get_pname_by_pid(pid_t pid, char *task_name)
-{
-#define BUF_SIZE 1024
- char proc_pid_path[BUF_SIZE];
- char buf[BUF_SIZE];
- sprintf(proc_pid_path, "/proc/%d/status", pid);
- FILE* fp = fopen(proc_pid_path, "r");
- if(NULL != fp){
- if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
- fclose(fp);
- }
- fclose(fp);
- sscanf(buf, "%*s %s", task_name);
- }
-}
-
-void sigproc(int __attribute__((__unused__))sig)
-{
- unsigned int tid = 0;
- libevent_thread *thread = NULL;
-
- struct config_bucket_t *rte = cert_default_config();
-
- for (tid = 0; tid < rte->thread_nu; tid++) {
- thread = threads + tid;
- if (thread->sync){
- redisAsyncDisconnect(thread->cl_ctx);
- free(thread->cl_ctx);
- redisFree(thread->sync);
- }
- event_base_free(thread->base);
- }
- kfree(threads);
-
- exit(1);
-}
-
-static int
-MESA_internal_set_para(screen_stat_handle_t handle, enum FS_option type, unsigned value)
-{
- int ret = FS_internal_set_para(handle, type, &value, (int)(sizeof(value)));
- return ret;
-}
-
-static int mesa_fiel_stat_init()
-{
- char stat_path[128] = {0};
- char pname[32]= {0}, buff[128] = {0};
-
- SGstats.handle = FS_internal_create_handle();
-
- rt_get_pname_by_pid(getpid(), &pname[0]);
- FS_internal_set_para(SGstats.handle, APP_NAME, pname, strlen(pname)+1);
- snprintf(stat_path, 128, "%s/fs2_%s.status", logging_sc_lid.run_log_path, pname);
- FS_internal_set_para(SGstats.handle, OUTPUT_DEVICE, stat_path, strlen(stat_path)+1);
-
- MESA_internal_set_para(SGstats.handle, FLUSH_BY_DATE, 0);
- MESA_internal_set_para(SGstats.handle, PRINT_MODE, 1);
- MESA_internal_set_para(SGstats.handle, CREATE_THREAD, 1);
- MESA_internal_set_para(SGstats.handle, STAT_CYCLE, 3);
-
- snprintf(buff,sizeof(buff),"%s", "Req");
- SGstats.line_ids[0] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff);
- snprintf(buff,sizeof(buff),"%s", "DB");
- SGstats.line_ids[1] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff);
- snprintf(buff,sizeof(buff),"%s", "Local");
- SGstats.line_ids[2] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff);
- snprintf(buff,sizeof(buff),"%s", "take-time");
- SGstats.line_ids[3] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff);
-
- MESA_internal_set_para(SGstats.handle, ID_INVISBLE, SGstats.line_ids[3]);
- snprintf(buff,sizeof(buff),"Cert/Nsec");
- FS_internal_register_ratio(SGstats.handle, SGstats.line_ids[3],
- SGstats.line_ids[2], 1,
- FS_STYLE_COLUMN, FS_CALC_CURRENT,
- buff);
- FS_internal_start(SGstats.handle);
-
- return 0;
-}
-
-static void
-x509_get_fingerprint(X509 *x509, char *finger)
-{
- int xret = -1;
- unsigned int len = 0, i = 0;
- unsigned char fdig[EVP_MAX_MD_SIZE] = {0};
-
- xret = X509_digest(x509, EVP_sha1(), fdig, &len);
- if (xret != 1)
- goto finish;
- for (i = 0; i < len ; ++i){
- sprintf(finger + i * sizeof(unsigned char) * 2, "%02x", fdig[i]);
- }
-finish:
- return;
-}
-
-void keyring_table_new_cb(int __attribute__((__unused__))table_id, const char __attribute__((__unused__))*key,
-const char* table_line, MAAT_PLUGIN_EX_DATA* ad, long __attribute__((__unused__))argl, void __attribute__((__unused__))* argp)
-{
- char profile_name[CT_ARRARY_LEN]={0};
- char private_file[CT_STRING_MAX] = {0}, public_file[CT_STRING_MAX]={0};
- char __attribute__((__unused__))_priv_file[CT_PATH_MAX] = {0};
- char __attribute__((__unused__))_publi_file[CT_PATH_MAX] = {0};
- int ret=0;
-
- struct pxy_obj_keyring *pxy_obj = NULL;
-
- pxy_obj = (struct pxy_obj_keyring *)malloc(sizeof(struct pxy_obj_keyring));
- if (!pxy_obj)
- {
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Can not alloc, %s", strerror(errno));
- goto finish;
- }
- memset(pxy_obj, 0, sizeof(struct pxy_obj_keyring));
- atomic64_set(&pxy_obj->ref_cnt, 1);
-
- ret=sscanf(table_line, "%d\t%s\t%s\t%s\t%s\t%lu\t%s\t%s\t%d", &pxy_obj->keyring_id, profile_name,
- pxy_obj->keyring_type, private_file, public_file, &pxy_obj->expire_after, pxy_obj->public_algo,
- pxy_obj->v3_ctl, &pxy_obj->is_valid);
- if(ret!=9)
- {
- kfree(&pxy_obj);
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "certstore parse config failed: %s", table_line);
- goto finish;
- }
-
- /*Load PUBLICKEY***/
- if ((pxy_obj->root = cert_load_x509(public_file, &pxy_obj->stack_ca)) == NULL ){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "initialize the x509 publickey failed, the keyring id is %d",
- pxy_obj->keyring_id);
- goto finish;
- }
- /*Load PRIVATEKEY**/
- if ((pxy_obj->key = cert_load_key(private_file)) == NULL){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "initialize the x509 privatekey failed, the keyring id is %d",
- pxy_obj->keyring_id);
- goto finish;
- }
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "initialize the x509 certificate, the keyring id is %d",
- pxy_obj->keyring_id);
- x509_get_fingerprint(pxy_obj->root, pxy_obj->finger);
-
- *ad = pxy_obj;
-finish:
- return;
-}
-
-void keyring_table_dup_cb(int __attribute__((__unused__))table_id, MAAT_PLUGIN_EX_DATA *to, MAAT_PLUGIN_EX_DATA *from,
-long __attribute__((__unused__))argl, void __attribute__((__unused__))*argp)
-{
- struct pxy_obj_keyring* pxy_obj=(struct pxy_obj_keyring*)(*from);
- if(pxy_obj==NULL)
- {
- *to=NULL;
- return;
- }
- atomic64_inc (&pxy_obj->ref_cnt);
- *((struct pxy_obj_keyring**)to)=pxy_obj;
-}
-
-int maat_table_ex_init(const char* table_name,
- Maat_plugin_EX_new_func_t* new_func,
- Maat_plugin_EX_free_func_t* free_func,
- Maat_plugin_EX_dup_func_t* dup_func)
-{
- int table_id = 0;
-
- struct config_bucket_t *rte = cert_default_config();
-
- table_id= rte->table_id = maat_table_register(rte->feather, table_name);
- if(table_id<0)
- {
- goto finish;
- }
- table_id=maat_plugin_EX_register(rte->feather,
- table_id,
- new_func,free_func,
- dup_func,NULL,0,NULL);
-finish:
- return table_id;
-}
-
-int maat_feather_init()
-{
- int ret = -1;
- Maat_feather_t feather = NULL;
- int scan_interval_ms = 1000;
-
- struct config_bucket_t *rte = cert_default_config();
- struct ntc_maat_t *maat_t = &rte->maat_t;
-
- int effective_interval_ms = maat_t->effective_interval_s * 1000;
-
- feather = maat_feather(rte->thread_nu, maat_t->info_path, logging_sc_lid.run_log_handle);
-
- maat_set_feather_opt(feather, MAAT_OPT_INSTANCE_NAME, "certstore", strlen("certstore") + 1);
-
- if (maat_t->maat_json_switch == 1){
- maat_set_feather_opt(feather, MAAT_OPT_JSON_FILE_PATH, maat_t->pxy_path, strlen(maat_t->pxy_path)+1);
- }
- if (maat_t->maat_json_switch == 0){
- maat_set_feather_opt(feather, MAAT_OPT_FULL_CFG_DIR, maat_t->full_cfg_dir, strlen(maat_t->full_cfg_dir)+1);
- maat_set_feather_opt(feather, MAAT_OPT_INC_CFG_DIR, maat_t->inc_cfg_dir, strlen(maat_t->inc_cfg_dir)+1);
- }
- if (maat_t->maat_json_switch == 2){
- maat_set_feather_opt(feather, MAAT_OPT_REDIS_IP, rte->addr_t.maat_ip, strlen(rte->addr_t.maat_ip)+1);
- maat_set_feather_opt(feather, MAAT_OPT_REDIS_PORT, &rte->addr_t.maat_port, sizeof(rte->addr_t.maat_port));
- maat_set_feather_opt(feather, MAAT_OPT_REDIS_INDEX, &rte->addr_t.dbindex, sizeof(rte->addr_t.dbindex));
- }
-
- maat_set_feather_opt(feather, MAAT_OPT_SCANDIR_INTERVAL_MS,&scan_interval_ms, sizeof(scan_interval_ms));
- maat_set_feather_opt(feather, MAAT_OPT_EFFECT_INVERVAL_MS,&effective_interval_ms, sizeof(effective_interval_ms));
- /***/
- const char* foregin_dir="./foreign_files/";
- maat_set_feather_opt(feather, MAAT_OPT_FOREIGN_CONT_DIR,foregin_dir, strlen(foregin_dir)+1);
- ret = maat_initiate_feather(feather);
- if (ret < 0)
- {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "%s MAAT init failed.", __FUNCTION__);
- }
- rte->feather = feather;
-
- int table_id = maat_table_ex_init("PXY_PROFILE_KEYRING",
- keyring_table_new_cb,
- keyring_table_free_cb,
- keyring_table_dup_cb);
- if(table_id<0)
- {
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "certstore register table PXY_PROFILE_KEYRING failed");
- }
-
- return 0;
-}
-
-int cert_session_init()
-{
- mesa_fiel_stat_init();
-
- maat_feather_init();
-
- libevent_socket_init();
-
- return 0;
-}
-
diff --git a/src/cert_session.h b/src/cert_session.h
deleted file mode 100644
index 896384b..0000000
--- a/src/cert_session.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*************************************************************************
- > File Name: cert_session.h
- > Author:
- > Mail:
- > Created Time: Fri 01 Jun 2018 02:01:08 AM PDT
- ************************************************************************/
-
-#ifndef _CERT_SESSION_H
-#define _CERT_SESSION_H
-
-#include "event_struct.h"
-#include "MESA_list_queue.h"
-#include "rt_sync.h"
-
-struct x509_object_ctx
-{
- X509 *root;
- EVP_PKEY *key;
-
- X509 *insec_root;
- EVP_PKEY *insec_key;
-};
-
-typedef struct {
- int id;
-
- rt_pthread pid; /* unique ID of this thread */
-
- evutil_socket_t accept_fd;
-
- rt_pthread_attr *attr;
-
- struct event_base *base;
-
- struct x509_object_ctx def;
-
- struct redisAsyncContext *cl_ctx;
-
- struct redisContext *sync;
-
- void * (*routine)(void *); /** Executive entry */
-
- int field_ids; /* dispaly */
-
- int column_ids;
-
- uint64_t diffTime;
-
-} libevent_thread;
-
-int cert_session_init();
-
-void sigproc(int __attribute__((__unused__))sig);
-
-#endif
-
diff --git a/src/cert_store.c b/src/cert_store.c
deleted file mode 100644
index e4dd4aa..0000000
--- a/src/cert_store.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*************************************************************************
- > File Name: cert_server.c
- > Author: fengweihao
- > Mail:
- > Created Time: Tue 29 May 2018 06:45:23 PM PDT
- ************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#include "rt_string.h"
-#include "rt_common.h"
-#include "cert_daemon.h"
-#include "cert_conf.h"
-#include "cert_session.h"
-#include "logging.h"
-#include "MESA_prof_load.h"
-
-/* GIT Release */
-#define CERT_GIT_RELEASE "1.1"
-
-#define MODE_TYPE(x) run_mode & x
-
-/* Configure Path */
-#if 0
-#define CERT_BASIC_CFG "/home/ceiec/certstore_run/conf/cert_store.ini"
-#else
-#define CERT_BASIC_CFG "./conf/cert_store.ini"
-#endif
-
-#ifdef VERSION_TARGET
-char *git_ver = VERSION_TARGET;
-#else
-char *git_ver = "0"
-#endif
-
-static char* cert_revision() { return (CERT_GIT_RELEASE); }
-
-enum syslog_display_format{
- FORMAT_CONSOLE,
- FORMAT_FILE,
- FORMAT_SYSLOG
-};
-
-static int run_mode;
-
-static void help()
-{
- printf("Welcome to certstore %s.%s\n", cert_revision(), VERSION_TARGET);
- printf("cert_store <--normal|--daemon>\n"
- "Usage:\n"
- " --normal | Run the program in normal mode\n"
- " --daemon | Run the program in daemon mode\n");
-}
-
-static void
-cert_argv_parser(int argc, char **argv)
-{
- int i;
-
- if (argc != 2){
- help();
- exit(0);
- }
-
- for (i = 0; argv[i] != NULL; i++){
- /** run version parser */
- if (!STRCMP (argv[i], "--normal")){
- goto finish;
- }
- /** daemonize */
- if (!STRCMP(argv[i], "--daemon")){
- run_mode = 0x20;
- goto finish;
- }
- }
-finish:
- return;
-}
-
-static
-void cert_preview ()
-{
- struct config_bucket_t *rte = cert_default_config();
-
- printf("\r\nBasic Configuration of CertStore \n");
- printf("%30s:%45d\n", "The Threads", rte->thread_nu);
- printf("%30s:%45s\n", "Store Redis Ip", rte->addr_t.store_ip);
- printf("%30s:%45d\n", "Store Redis Port", rte->addr_t.store_port);
- printf("%30s:%45s\n", "Maat Redis Ip", rte->addr_t.maat_ip);
- printf("%30s:%45d\n", "Maat Redis Port", rte->addr_t.maat_port);
- printf("%30s:%45d\n", "Maat Redis index", rte->addr_t.dbindex);
- printf("%30s:%45d\n", "Libevent Port", rte->addr_t.e_port);
- printf("%30s:%45s\n", "Cert Path", rte->ca_path);
- printf("%30s:%45s\n", "Uninsec cert Path", rte->uninsec_path);
- printf("%30s:%45s\n", "Log Directory", logging_sc_lid.run_log_path);
- printf("%30s:%45s\n", "Table Info", rte->maat_t.info_path);
- if (rte->maat_t.maat_json_switch == 1){
- printf("%30s:%45s\n", "Pxy Obj Keyring", rte->maat_t.pxy_path);
- }
- if (rte->maat_t.maat_json_switch == 0){
- printf("%30s:%45d\n", "Scan Interval", rte->maat_t.effective_interval_s);
- printf("%30s:%45s\n", "Full Cfg Path", rte->maat_t.full_cfg_dir);
- printf("%30s:%45s\n", "Inc Cfg Path", rte->maat_t.inc_cfg_dir);
-
- }
- printf("\r\n");
-}
-
-int main(int argc, char **argv)
-{
- cert_argv_parser(argc, argv);
-
- cert_syslog_init(CERT_BASIC_CFG);
-
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Cert server init success");
-
- cert_init_config(CERT_BASIC_CFG);
-
- if (MODE_TYPE(0x20)){
- daemonize();
- }
- cert_preview();
-
- cert_session_init();
-
- signal(SIGINT, sigproc);
-
- return 0;
-}
-
diff --git a/src/components/json/arraylist.c b/src/components/json/arraylist.c
deleted file mode 100644
index 81b6fa2..0000000
--- a/src/components/json/arraylist.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * $Id: arraylist.c,v 1.4 2006/01/26 02:16:28 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#include "config.h"
-
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <string.h>
-#endif /* STDC_HEADERS */
-
-#if defined(HAVE_STRINGS_H) && !defined(_STRING_H) && !defined(__USE_BSD)
-# include <strings.h>
-#endif /* HAVE_STRINGS_H */
-
-#include "bits.h"
-#include "arraylist.h"
-
-struct array_list*
-array_list_new(array_list_free_fn *free_fn)
-{
- struct array_list *arr;
-
- arr = (struct array_list*)calloc(1, sizeof(struct array_list));
- if(!arr) return NULL;
- arr->size = ARRAY_LIST_DEFAULT_SIZE;
- arr->length = 0;
- arr->free_fn = free_fn;
- if(!(arr->array = (void**)calloc(sizeof(void*), arr->size))) {
- free(arr);
- return NULL;
- }
- return arr;
-}
-
-extern void
-array_list_free(struct array_list *arr)
-{
- int i;
- for(i = 0; i < arr->length; i++)
- if(arr->array[i]) arr->free_fn(arr->array[i]);
- free(arr->array);
- free(arr);
-}
-
-void*
-array_list_get_idx(struct array_list *arr, int i)
-{
- if(i >= arr->length) return NULL;
- return arr->array[i];
-}
-
-static int array_list_expand_internal(struct array_list *arr, int max)
-{
- void *t;
- int new_size;
-
- if(max < arr->size) return 0;
- new_size = json_max(arr->size << 1, max);
- if(!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1;
- arr->array = (void**)t;
- (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*));
- arr->size = new_size;
- return 0;
-}
-
-int
-array_list_put_idx(struct array_list *arr, int idx, void *data)
-{
- if(array_list_expand_internal(arr, idx+1)) return -1;
- if(arr->array[idx]) arr->free_fn(arr->array[idx]);
- arr->array[idx] = data;
- if(arr->length <= idx) arr->length = idx + 1;
- return 0;
-}
-
-int
-array_list_add(struct array_list *arr, void *data)
-{
- return array_list_put_idx(arr, arr->length, data);
-}
-
-void
-array_list_sort(struct array_list *arr, int(*sort_fn)(const void *, const void *))
-{
- qsort(arr->array, arr->length, sizeof(arr->array[0]),
- (int (*)(const void *, const void *))sort_fn);
-}
-
-int
-array_list_length(struct array_list *arr)
-{
- return arr->length;
-}
diff --git a/src/components/json/arraylist.h b/src/components/json/arraylist.h
deleted file mode 100644
index 4f3113c..0000000
--- a/src/components/json/arraylist.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * $Id: arraylist.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef _arraylist_h_
-#define _arraylist_h_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ARRAY_LIST_DEFAULT_SIZE 32
-
-typedef void (array_list_free_fn) (void *data);
-
-struct array_list
-{
- void **array;
- int length;
- int size;
- array_list_free_fn *free_fn;
-};
-
-extern struct array_list*
-array_list_new(array_list_free_fn *free_fn);
-
-extern void
-array_list_free(struct array_list *al);
-
-extern void*
-array_list_get_idx(struct array_list *al, int i);
-
-extern int
-array_list_put_idx(struct array_list *al, int i, void *data);
-
-extern int
-array_list_add(struct array_list *al, void *data);
-
-extern int
-array_list_length(struct array_list *al);
-
-extern void
-array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/json/bits.h b/src/components/json/bits.h
deleted file mode 100644
index c8cbbc8..0000000
--- a/src/components/json/bits.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * $Id: bits.h,v 1.10 2006/01/30 23:07:57 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef _bits_h_
-#define _bits_h_
-
-#ifndef json_min
-#define json_min(a,b) ((a) < (b) ? (a) : (b))
-#endif
-
-#ifndef json_max
-#define json_max(a,b) ((a) > (b) ? (a) : (b))
-#endif
-
-#define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9)
-#define error_ptr(error) ((void*)error)
-#define error_description(error) (json_tokener_errors[error])
-#define is_error(ptr) (ptr == NULL)
-
-#endif
diff --git a/src/components/json/config.h b/src/components/json/config.h
deleted file mode 100644
index 018a17f..0000000
--- a/src/components/json/config.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/* config.h. Generated from config.h.in by configure. */
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Enable RDRANR Hardware RNG Hash Seed */
-/* #undef ENABLE_RDRAND */
-
-/* Define if .gnu.warning accepts long strings. */
-/* #undef HAS_GNU_WARNING_LONG */
-
-/* Define to 1 if you have the declaration of `INFINITY', and to 0 if you
- don't. */
-#define HAVE_DECL_INFINITY 1
-
-/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't.
- */
-#define HAVE_DECL_ISINF 1
-
-/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.
- */
-#define HAVE_DECL_ISNAN 1
-
-/* Define to 1 if you have the declaration of `nan', and to 0 if you don't. */
-#define HAVE_DECL_NAN 1
-
-/* Define to 1 if you have the declaration of `_finite', and to 0 if you
- don't. */
-#define HAVE_DECL__FINITE 0
-
-/* Define to 1 if you have the declaration of `_isnan', and to 0 if you don't.
- */
-#define HAVE_DECL__ISNAN 0
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
-/* #undef HAVE_DOPRNT */
-
-/* Define to 1 if you have the <endian.h> header file. */
-#define HAVE_ENDIAN_H 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#define HAVE_LOCALE_H 1
-
-/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
- to 0 otherwise. */
-#define HAVE_MALLOC 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the `open' function. */
-#define HAVE_OPEN 1
-
-/* Define to 1 if your system has a GNU libc compatible `realloc' function,
- and to 0 otherwise. */
-#define HAVE_REALLOC 1
-
-/* Define to 1 if you have the `setlocale' function. */
-#define HAVE_SETLOCALE 1
-
-/* Define to 1 if you have the `snprintf' function. */
-#define HAVE_SNPRINTF 1
-
-/* Define to 1 if you have the <stdarg.h> header file. */
-#define HAVE_STDARG_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#define HAVE_STRCASECMP 1
-
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
-
-/* Define to 1 if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strncasecmp' function. */
-#define HAVE_STRNCASECMP 1
-
-/* Define to 1 if you have the <syslog.h> header file. */
-#define HAVE_SYSLOG_H 1
-
-/* Define to 1 if you have the <sys/cdefs.h> header file. */
-#define HAVE_SYS_CDEFS_H 1
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#define HAVE_SYS_PARAM_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the `vasprintf' function. */
-#define HAVE_VASPRINTF 1
-
-/* Define to 1 if you have the `vprintf' function. */
-#define HAVE_VPRINTF 1
-
-/* Define to 1 if you have the `vsnprintf' function. */
-#define HAVE_VSNPRINTF 1
-
-/* Define to 1 if you have the `vsyslog' function. */
-#define HAVE_VSYSLOG 1
-
-/* Public define for json_inttypes.h */
-#define JSON_C_HAVE_INTTYPES_H 1
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#define LT_OBJDIR ".libs/"
-
-/* Name of package */
-#define PACKAGE "json-c"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "[email protected]"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "json-c"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "json-c 0.12"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "json-c"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "0.12"
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Version number of package */
-#define VERSION "0.12"
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to rpl_malloc if the replacement function should be used. */
-/* #undef malloc */
-
-/* Define to rpl_realloc if the replacement function should be used. */
-/* #undef realloc */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
diff --git a/src/components/json/debug.c b/src/components/json/debug.c
deleted file mode 100644
index 3b64b59..0000000
--- a/src/components/json/debug.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * $Id: debug.c,v 1.5 2006/01/26 02:16:28 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-#if HAVE_SYSLOG_H
-# include <syslog.h>
-#endif /* HAVE_SYSLOG_H */
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif /* HAVE_UNISTD_H */
-
-#if HAVE_SYS_PARAM_H
-#include <sys/param.h>
-#endif /* HAVE_SYS_PARAM_H */
-
-#include "debug.h"
-
-static int _syslog = 0;
-static int _debug = 0;
-
-void mc_set_debug(int debug) { _debug = debug; }
-int mc_get_debug(void) { return _debug; }
-
-extern void mc_set_syslog(int syslog)
-{
- _syslog = syslog;
-}
-
-void mc_debug(const char *msg, ...)
-{
- va_list ap;
- if(_debug) {
- va_start(ap, msg);
-#if HAVE_VSYSLOG
- if(_syslog) {
- vsyslog(LOG_DEBUG, msg, ap);
- } else
-#endif
- vprintf(msg, ap);
- va_end(ap);
- }
-}
-
-void mc_error(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg);
-#if HAVE_VSYSLOG
- if(_syslog) {
- vsyslog(LOG_ERR, msg, ap);
- } else
-#endif
- vfprintf(stderr, msg, ap);
- va_end(ap);
-}
-
-void mc_info(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg);
-#if HAVE_VSYSLOG
- if(_syslog) {
- vsyslog(LOG_INFO, msg, ap);
- } else
-#endif
- vfprintf(stderr, msg, ap);
- va_end(ap);
-}
diff --git a/src/components/json/debug.h b/src/components/json/debug.h
deleted file mode 100644
index 80ca3e4..0000000
--- a/src/components/json/debug.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * $Id: debug.h,v 1.5 2006/01/30 23:07:57 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef _DEBUG_H_
-#define _DEBUG_H_
-
-#include <stdlib.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void mc_set_debug(int debug);
-extern int mc_get_debug(void);
-
-extern void mc_set_syslog(int syslog);
-
-extern void mc_debug(const char *msg, ...);
-extern void mc_error(const char *msg, ...);
-extern void mc_info(const char *msg, ...);
-
-#ifndef __STRING
-#define __STRING(x) #x
-#endif
-
-#ifndef PARSER_BROKEN_FIXED
-
-#define JASSERT(cond) do {} while(0)
-
-#else
-
-#define JASSERT(cond) do { \
- if (!(cond)) { \
- mc_error("cjson assert failure %s:%d : cond \"" __STRING(cond) "failed\n", __FILE__, __LINE__); \
- *(int *)0 = 1;\
- abort(); \
- }\
- } while(0)
-
-#endif
-
-#define MC_ERROR(x, ...) mc_error(x, ##__VA_ARGS__)
-
-#ifdef MC_MAINTAINER_MODE
-#define MC_SET_DEBUG(x) mc_set_debug(x)
-#define MC_GET_DEBUG() mc_get_debug()
-#define MC_SET_SYSLOG(x) mc_set_syslog(x)
-#define MC_DEBUG(x, ...) mc_debug(x, ##__VA_ARGS__)
-#define MC_INFO(x, ...) mc_info(x, ##__VA_ARGS__)
-#else
-#define MC_SET_DEBUG(x) if (0) mc_set_debug(x)
-#define MC_GET_DEBUG() (0)
-#define MC_SET_SYSLOG(x) if (0) mc_set_syslog(x)
-#define MC_DEBUG(x, ...) if (0) mc_debug(x, ##__VA_ARGS__)
-#define MC_INFO(x, ...) if (0) mc_info(x, ##__VA_ARGS__)
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/json/json.h b/src/components/json/json.h
deleted file mode 100644
index 4339b20..0000000
--- a/src/components/json/json.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * $Id: json.h,v 1.6 2006/01/26 02:16:28 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef _json_h_
-#define _json_h_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "bits.h"
-#include "debug.h"
-#include "linkhash.h"
-#include "arraylist.h"
-#include "json_util.h"
-#include "json_object.h"
-#include "json_tokener.h"
-#include "json_object_iterator.h"
-#include "json_c_version.h"
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/json/json.mk b/src/components/json/json.mk
deleted file mode 100644
index 82d82ab..0000000
--- a/src/components/json/json.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-# standard component Makefile header
-sp := $(sp).x
-dirstack_$(sp) := $(d)
-d := $(dir)
-
-# component specification
-
-OBJS_$(d) :=\
- $(OBJ_DIR)/arraylist.o\
- $(OBJ_DIR)/debug.o\
- $(OBJ_DIR)/json_c_version.o\
- $(OBJ_DIR)/json_object.o\
- $(OBJ_DIR)/json_object_iterator.o\
- $(OBJ_DIR)/json_tokener.o\
- $(OBJ_DIR)/json_util.o\
- $(OBJ_DIR)/libjson.o\
- $(OBJ_DIR)/linkhash.o\
- $(OBJ_DIR)/parse_flags.o\
- $(OBJ_DIR)/printbuf.o\
- $(OBJ_DIR)/json_checker.o\
- $(OBJ_DIR)/random_seed.o
-
-
-CFLAGS_LOCAL += -I$(d)
-$(OBJS_$(d)): CFLAGS_LOCAL := -std=gnu99 -g -O3\
- -I$(d)
-
-
-# standard component Makefile rules
-
-DEPS_$(d) := $(OBJS_$(d):.o=.d)
-
-CLEAN_LIST := $(CLEAN_LIST) $(OBJS_$(d)) $(DEPS_$(d))
-
-$(OBJ_DIR)/%.o: $(d)/%.c
- $(COMPILE)
-
--include $(DEPS_$(d))
-
-# standard component Makefile footer
-
-d := $(dirstack_$(sp))
-sp := $(basename $(sp))
diff --git a/src/components/json/json_c_version.c b/src/components/json/json_c_version.c
deleted file mode 100644
index 13eb188..0000000
--- a/src/components/json/json_c_version.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (c) 2012 Eric Haszlakiewicz
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- */
-#include "config.h"
-
-#include "json_c_version.h"
-
-const char *json_c_version(void)
-{
- return JSON_C_VERSION;
-}
-
-int json_c_version_num(void)
-{
- return JSON_C_VERSION_NUM;
-}
-
diff --git a/src/components/json/json_c_version.h b/src/components/json/json_c_version.h
deleted file mode 100644
index eed98a4..0000000
--- a/src/components/json/json_c_version.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2012 Eric Haszlakiewicz
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- */
-
-#ifndef _json_c_version_h_
-#define _json_c_version_h_
-
-#define JSON_C_MAJOR_VERSION 0
-#define JSON_C_MINOR_VERSION 12
-#define JSON_C_MICRO_VERSION 0
-#define JSON_C_VERSION_NUM ((JSON_C_MAJOR_VERSION << 16) | \
- (JSON_C_MINOR_VERSION << 8) | \
- JSON_C_MICRO_VERSION)
-#define JSON_C_VERSION "0.12"
-
-const char *json_c_version(void); /* Returns JSON_C_VERSION */
-int json_c_version_num(void); /* Returns JSON_C_VERSION_NUM */
-
-#endif
diff --git a/src/components/json/json_checker.c b/src/components/json/json_checker.c
deleted file mode 100644
index 33491ed..0000000
--- a/src/components/json/json_checker.c
+++ /dev/null
@@ -1,421 +0,0 @@
-/* JSON_checker.c */
-
-/* 2016-11-11 */
-
-/*
-Copyright (c) 2005 JSON.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-The Software shall be used for Good, not Evil.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-#include <stdlib.h>
-#include "json_checker.h"
-
-#define TRUE 1
-#define FALSE 0
-#define GOOD 0xBABAB00E
-#define __ -1 /* the universal error code */
-
-/*
- Characters are mapped into these 31 character classes. This allows for
- a significant reduction in the size of the state transition table.
-*/
-
-enum classes {
- C_SPACE, /* space */
- C_WHITE, /* other whitespace */
- C_LCURB, /* { */
- C_RCURB, /* } */
- C_LSQRB, /* [ */
- C_RSQRB, /* ] */
- C_COLON, /* : */
- C_COMMA, /* , */
- C_QUOTE, /* " */
- C_BACKS, /* \ */
- C_SLASH, /* / */
- C_PLUS, /* + */
- C_MINUS, /* - */
- C_POINT, /* . */
- C_ZERO , /* 0 */
- C_DIGIT, /* 123456789 */
- C_LOW_A, /* a */
- C_LOW_B, /* b */
- C_LOW_C, /* c */
- C_LOW_D, /* d */
- C_LOW_E, /* e */
- C_LOW_F, /* f */
- C_LOW_L, /* l */
- C_LOW_N, /* n */
- C_LOW_R, /* r */
- C_LOW_S, /* s */
- C_LOW_T, /* t */
- C_LOW_U, /* u */
- C_ABCDF, /* ABCDF */
- C_E, /* E */
- C_ETC, /* everything else */
- NR_CLASSES
-};
-
-static int ascii_class[128] = {
-/*
- This array maps the 128 ASCII characters into character classes.
- The remaining Unicode characters should be mapped to C_ETC.
- Non-whitespace control characters are errors.
-*/
- __, __, __, __, __, __, __, __,
- __, C_WHITE, C_WHITE, __, __, C_WHITE, __, __,
- __, __, __, __, __, __, __, __,
- __, __, __, __, __, __, __, __,
-
- C_SPACE, C_ETC, C_QUOTE, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,
- C_ETC, C_ETC, C_ETC, C_PLUS, C_COMMA, C_MINUS, C_POINT, C_SLASH,
- C_ZERO, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT,
- C_DIGIT, C_DIGIT, C_COLON, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,
-
- C_ETC, C_ABCDF, C_ABCDF, C_ABCDF, C_ABCDF, C_E, C_ABCDF, C_ETC,
- C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,
- C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,
- C_ETC, C_ETC, C_ETC, C_LSQRB, C_BACKS, C_RSQRB, C_ETC, C_ETC,
-
- C_ETC, C_LOW_A, C_LOW_B, C_LOW_C, C_LOW_D, C_LOW_E, C_LOW_F, C_ETC,
- C_ETC, C_ETC, C_ETC, C_ETC, C_LOW_L, C_ETC, C_LOW_N, C_ETC,
- C_ETC, C_ETC, C_LOW_R, C_LOW_S, C_LOW_T, C_LOW_U, C_ETC, C_ETC,
- C_ETC, C_ETC, C_ETC, C_LCURB, C_ETC, C_RCURB, C_ETC, C_ETC
-};
-
-
-/*
- The state codes.
-*/
-enum states {
- GO, /* start */
- OK, /* ok */
- OB, /* object */
- KE, /* key */
- CO, /* colon */
- VA, /* value */
- AR, /* array */
- ST, /* string */
- ES, /* escape */
- U1, /* u1 */
- U2, /* u2 */
- U3, /* u3 */
- U4, /* u4 */
- MI, /* minus */
- ZE, /* zero */
- IN, /* integer */
- FR, /* fraction */
- FS, /* fraction */
- E1, /* e */
- E2, /* ex */
- E3, /* exp */
- T1, /* tr */
- T2, /* tru */
- T3, /* true */
- F1, /* fa */
- F2, /* fal */
- F3, /* fals */
- F4, /* false */
- N1, /* nu */
- N2, /* nul */
- N3, /* null */
- NR_STATES
-};
-
-
-static int state_transition_table[NR_STATES][NR_CLASSES] = {
-/*
- The state transition table takes the current state and the current symbol,
- and returns either a new state or an action. An action is represented as a
- negative number. A JSON text is accepted if at the end of the text the
- state is OK and if the mode is MODE_DONE.
-
- white 1-9 ABCDF etc
- space | { } [ ] : , " \ / + - . 0 | a b c d e f l n r s t u | E |*/
-/*start GO*/ {GO,GO,-6,__,-5,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*ok OK*/ {OK,OK,__,-8,__,-7,__,-3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*object OB*/ {OB,OB,__,-9,__,__,__,__,ST,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*key KE*/ {KE,KE,__,__,__,__,__,__,ST,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*colon CO*/ {CO,CO,__,__,__,__,-2,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*value VA*/ {VA,VA,-6,__,-5,__,__,__,ST,__,__,__,MI,__,ZE,IN,__,__,__,__,__,F1,__,N1,__,__,T1,__,__,__,__},
-/*array AR*/ {AR,AR,-6,__,-5,-7,__,__,ST,__,__,__,MI,__,ZE,IN,__,__,__,__,__,F1,__,N1,__,__,T1,__,__,__,__},
-/*string ST*/ {ST,__,ST,ST,ST,ST,ST,ST,-4,ES,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST},
-/*escape ES*/ {__,__,__,__,__,__,__,__,ST,ST,ST,__,__,__,__,__,__,ST,__,__,__,ST,__,ST,ST,__,ST,U1,__,__,__},
-/*u1 U1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,U2,U2,U2,U2,U2,U2,U2,U2,__,__,__,__,__,__,U2,U2,__},
-/*u2 U2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,U3,U3,U3,U3,U3,U3,U3,U3,__,__,__,__,__,__,U3,U3,__},
-/*u3 U3*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,U4,U4,U4,U4,U4,U4,U4,U4,__,__,__,__,__,__,U4,U4,__},
-/*u4 U4*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,ST,ST,ST,ST,ST,ST,ST,ST,__,__,__,__,__,__,ST,ST,__},
-/*minus MI*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,ZE,IN,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*zero ZE*/ {OK,OK,__,-8,__,-7,__,-3,__,__,__,__,__,FR,__,__,__,__,__,__,E1,__,__,__,__,__,__,__,__,E1,__},
-/*int IN*/ {OK,OK,__,-8,__,-7,__,-3,__,__,__,__,__,FR,IN,IN,__,__,__,__,E1,__,__,__,__,__,__,__,__,E1,__},
-/*frac FR*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,FS,FS,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*fracs FS*/ {OK,OK,__,-8,__,-7,__,-3,__,__,__,__,__,__,FS,FS,__,__,__,__,E1,__,__,__,__,__,__,__,__,E1,__},
-/*e E1*/ {__,__,__,__,__,__,__,__,__,__,__,E2,E2,__,E3,E3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*ex E2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,E3,E3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*exp E3*/ {OK,OK,__,-8,__,-7,__,-3,__,__,__,__,__,__,E3,E3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*tr T1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,T2,__,__,__,__,__,__},
-/*tru T2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,T3,__,__,__},
-/*true T3*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,OK,__,__,__,__,__,__,__,__,__,__},
-/*fa F1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,F2,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
-/*fal F2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,F3,__,__,__,__,__,__,__,__},
-/*fals F3*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,F4,__,__,__,__,__},
-/*false F4*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,OK,__,__,__,__,__,__,__,__,__,__},
-/*nu N1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,N2,__,__,__},
-/*nul N2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,N3,__,__,__,__,__,__,__,__},
-/*null N3*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,OK,__,__,__,__,__,__,__,__}
-};
-
-
-/*
- These modes can be pushed on the stack.
-*/
-enum modes {
- MODE_ARRAY,
- MODE_DONE,
- MODE_KEY,
- MODE_OBJECT
-};
-
-static void
-destroy(JSON_checker jc)
-{
-/*
- Delete the JSON_checker object.
-*/
- jc->valid = 0;
- free((void*)jc->stack);
- free((void*)jc);
-}
-
-
-static int
-reject(JSON_checker jc)
-{
-/*
- Delete the JSON_checker object.
-*/
- destroy(jc);
- return FALSE;
-}
-
-
-static int
-push(JSON_checker jc, int mode)
-{
-/*
- Push a mode onto the stack. Return false if there is overflow.
-*/
- jc->top += 1;
- if (jc->top >= jc->depth) {
- return FALSE;
- }
- jc->stack[jc->top] = mode;
- return TRUE;
-}
-
-
-static int
-pop(JSON_checker jc, int mode)
-{
-/*
- Pop the stack, assuring that the current mode matches the expectation.
- Return false if there is underflow or if the modes mismatch.
-*/
- if (jc->top < 0 || jc->stack[jc->top] != mode) {
- return FALSE;
- }
- jc->top -= 1;
- return TRUE;
-}
-
-
-JSON_checker
-new_JSON_checker(int depth)
-{
-/*
- new_JSON_checker starts the checking process by constructing a JSON_checker
- object. It takes a depth parameter that restricts the level of maximum
- nesting.
-
- To continue the process, call JSON_checker_char for each character in the
- JSON text, and then call JSON_checker_done to obtain the final result.
- These functions are fully reentrant.
-
- The JSON_checker object will be deleted by JSON_checker_done.
- JSON_checker_char will delete the JSON_checker object if it sees an error.
-*/
- JSON_checker jc = (JSON_checker)malloc(sizeof(struct JSON_checker_struct));
- jc->valid = GOOD;
- jc->state = GO;
- jc->depth = depth;
- jc->top = -1;
- jc->stack = (int*)calloc(depth, sizeof(int));
- push(jc, MODE_DONE);
- return jc;
-}
-
-
-int
-JSON_checker_char(JSON_checker jc, int next_char)
-{
-/*
- After calling new_JSON_checker, call this function for each character (or
- partial character) in your JSON text. It can accept UTF-8, UTF-16, or
- UTF-32. It returns TRUE if things are looking ok so far. If it rejects the
- text, it destroys the JSON_checker object and returns false.
-*/
- int next_class, next_state;
-/*
- Determine the character's class.
-*/
- if (jc->valid != GOOD) {
- return FALSE;
- }
- if (next_char < 0) {
- return reject(jc);
- }
- if (next_char >= 128) {
- next_class = C_ETC;
- } else {
- next_class = ascii_class[next_char];
- if (next_class <= __) {
- return reject(jc);
- }
- }
-/*
- Get the next state from the state transition table.
-*/
- next_state = state_transition_table[jc->state][next_class];
- if (next_state >= 0) {
-/*
- Change the state.
-*/
- jc->state = next_state;
-/*
- Or perform one of the actions.
-*/
- } else {
- switch (next_state) {
-/* empty } */
- case -9:
- if (!pop(jc, MODE_KEY)) {
- return reject(jc);
- }
- jc->state = OK;
- break;
-
-/* } */ case -8:
- if (!pop(jc, MODE_OBJECT)) {
- return reject(jc);
- }
- jc->state = OK;
- break;
-
-/* ] */ case -7:
- if (!pop(jc, MODE_ARRAY)) {
- return reject(jc);
- }
- jc->state = OK;
- break;
-
-/* { */ case -6:
- if (!push(jc, MODE_KEY)) {
- return reject(jc);
- }
- jc->state = OB;
- break;
-
-/* [ */ case -5:
- if (!push(jc, MODE_ARRAY)) {
- return reject(jc);
- }
- jc->state = AR;
- break;
-
-/* " */ case -4:
- switch (jc->stack[jc->top]) {
- case MODE_KEY:
- jc->state = CO;
- break;
- case MODE_ARRAY:
- case MODE_OBJECT:
- jc->state = OK;
- break;
- default:
- return reject(jc);
- }
- break;
-
-/* , */ case -3:
- switch (jc->stack[jc->top]) {
- case MODE_OBJECT:
-/*
- A comma causes a flip from object mode to key mode.
-*/
- if (!pop(jc, MODE_OBJECT) || !push(jc, MODE_KEY)) {
- return reject(jc);
- }
- jc->state = KE;
- break;
- case MODE_ARRAY:
- jc->state = VA;
- break;
- default:
- return reject(jc);
- }
- break;
-
-/* : */ case -2:
-/*
- A colon causes a flip from key mode to object mode.
-*/
- if (!pop(jc, MODE_KEY) || !push(jc, MODE_OBJECT)) {
- return reject(jc);
- }
- jc->state = VA;
- break;
-/*
- Bad action.
-*/
- default:
- return reject(jc);
- }
- }
- return TRUE;
-}
-
-
-int
-JSON_checker_done(JSON_checker jc)
-{
-/*
- The JSON_checker_done function should be called after all of the characters
- have been processed, but only if every call to JSON_checker_char returned
- true. This function deletes the JSON_checker and returns true if the JSON
- text was accepted.
-*/
- if (jc->valid != GOOD) {
- return FALSE;
- }
- int result = jc->state == OK && pop(jc, MODE_DONE);
- destroy(jc);
- return result;
-}
diff --git a/src/components/json/json_checker.h b/src/components/json/json_checker.h
deleted file mode 100644
index 7623c38..0000000
--- a/src/components/json/json_checker.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* JSON_checker.h */
-
-/* 2016-11-11 */
-
-/*
- The JSON_checker_struct is used to hold the state of the JSON_checker
- so that the code can be reentrant.
-*/
-
-typedef struct JSON_checker_struct {
- int valid;
- int state;
- int depth;
- int top;
- int* stack;
-} * JSON_checker;
-
-
-extern JSON_checker new_JSON_checker(int depth);
-
-/*
- Make a new JSON_checker. You indicate the maximum depth that is allowed.
- It will return an object that you will pass to the other functions.
- They will destroy the object for you.
-*/
-
-extern int JSON_checker_char(JSON_checker jc, int next_char);
-
-/*
- You should call JSON_checker_char for each character of the JSON text.
- It will return false if the text is not right.
-*/
-
-extern int JSON_checker_done(JSON_checker jc);
-
-/*
- When there are no more JSON text characters, call JSON_checker_done.
- It will return false if the text was not right.
-*/
diff --git a/src/components/json/json_config.h b/src/components/json/json_config.h
deleted file mode 100644
index 965ff1c..0000000
--- a/src/components/json/json_config.h
+++ /dev/null
@@ -1,4 +0,0 @@
-/* json_config.h. Generated from json_config.h.in by configure. */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define JSON_C_HAVE_INTTYPES_H 1
diff --git a/src/components/json/json_inttypes.h b/src/components/json/json_inttypes.h
deleted file mode 100644
index 9de8d24..0000000
--- a/src/components/json/json_inttypes.h
+++ /dev/null
@@ -1,28 +0,0 @@
-
-#ifndef _json_inttypes_h_
-#define _json_inttypes_h_
-
-#include "json_config.h"
-
-#if defined(_MSC_VER) && _MSC_VER <= 1700
-
-/* Anything less than Visual Studio C++ 10 is missing stdint.h and inttypes.h */
-typedef __int32 int32_t;
-#define INT32_MIN ((int32_t)_I32_MIN)
-#define INT32_MAX ((int32_t)_I32_MAX)
-typedef __int64 int64_t;
-#define INT64_MIN ((int64_t)_I64_MIN)
-#define INT64_MAX ((int64_t)_I64_MAX)
-#define PRId64 "I64d"
-#define SCNd64 "I64d"
-
-#else
-
-#ifdef JSON_C_HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-/* inttypes.h includes stdint.h */
-
-#endif
-
-#endif
diff --git a/src/components/json/json_object.c b/src/components/json/json_object.c
deleted file mode 100644
index 5083a9c..0000000
--- a/src/components/json/json_object.c
+++ /dev/null
@@ -1,868 +0,0 @@
-/*
- * $Id: json_object.c,v 1.17 2006/07/25 03:24:50 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <math.h>
-#include <errno.h>
-
-#include "debug.h"
-#include "printbuf.h"
-#include "linkhash.h"
-#include "arraylist.h"
-#include "json_inttypes.h"
-#include "json_object.h"
-#include "json_object_private.h"
-#include "json_util.h"
-#include "math_compat.h"
-
-#if !defined(HAVE_STRDUP) && defined(_MSC_VER)
- /* MSC has the version as _strdup */
-# define strdup _strdup
-#elif !defined(HAVE_STRDUP)
-# error You do not have strdup on your system.
-#endif /* HAVE_STRDUP */
-
-#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER)
- /* MSC has the version as _snprintf */
-# define snprintf _snprintf
-#elif !defined(HAVE_SNPRINTF)
-# error You do not have snprintf on your system.
-#endif /* HAVE_SNPRINTF */
-
-// Don't define this. It's not thread-safe.
-/* #define REFCOUNT_DEBUG 1 */
-
-const char *json_number_chars = "0123456789.+-eE";
-const char *json_hex_chars = "0123456789abcdefABCDEF";
-
-static void json_object_generic_delete(struct json_object* jso);
-static struct json_object* json_object_new(enum json_type o_type);
-
-static json_object_to_json_string_fn json_object_object_to_json_string;
-static json_object_to_json_string_fn json_object_boolean_to_json_string;
-static json_object_to_json_string_fn json_object_int_to_json_string;
-static json_object_to_json_string_fn json_object_double_to_json_string;
-static json_object_to_json_string_fn json_object_string_to_json_string;
-static json_object_to_json_string_fn json_object_array_to_json_string;
-
-
-/* ref count debugging */
-
-#ifdef REFCOUNT_DEBUG
-
-static struct lh_table *json_object_table;
-
-static void json_object_init(void) __attribute__ ((constructor));
-static void json_object_init(void) {
- MC_DEBUG("json_object_init: creating object table\n");
- json_object_table = lh_kptr_table_new(128, "json_object_table", NULL);
-}
-
-static void json_object_fini(void) __attribute__ ((destructor));
-static void json_object_fini(void) {
- struct lh_entry *ent;
- if(MC_GET_DEBUG()) {
- if (json_object_table->count) {
- MC_DEBUG("json_object_fini: %d referenced objects at exit\n",
- json_object_table->count);
- lh_foreach(json_object_table, ent) {
- struct json_object* obj = (struct json_object*)ent->v;
- MC_DEBUG("\t%s:%p\n", json_type_to_name(obj->o_type), obj);
- }
- }
- }
- MC_DEBUG("json_object_fini: freeing object table\n");
- lh_table_free(json_object_table);
-}
-#endif /* REFCOUNT_DEBUG */
-
-
-/* string escaping */
-
-static int json_escape_str(struct printbuf *pb, char *str, int len)
-{
- int pos = 0, start_offset = 0;
- unsigned char c;
- while (len--) {
- c = str[pos];
- switch(c) {
- case '\b':
- case '\n':
- case '\r':
- case '\t':
- case '\f':
- case '"':
- case '\\':
- case '/':
- if(pos - start_offset > 0)
- printbuf_memappend(pb, str + start_offset, pos - start_offset);
- if(c == '\b') printbuf_memappend(pb, "\\b", 2);
- else if(c == '\n') printbuf_memappend(pb, "\\n", 2);
- else if(c == '\r') printbuf_memappend(pb, "\\r", 2);
- else if(c == '\t') printbuf_memappend(pb, "\\t", 2);
- else if(c == '\f') printbuf_memappend(pb, "\\f", 2);
- else if(c == '"') printbuf_memappend(pb, "\\\"", 2);
- else if(c == '\\') printbuf_memappend(pb, "\\\\", 2);
- else if(c == '/') printbuf_memappend(pb, "\\/", 2);
- start_offset = ++pos;
- break;
- default:
- if(c < ' ') {
- if(pos - start_offset > 0)
- printbuf_memappend(pb, str + start_offset, pos - start_offset);
- sprintbuf(pb, "\\u00%c%c",
- json_hex_chars[c >> 4],
- json_hex_chars[c & 0xf]);
- start_offset = ++pos;
- } else pos++;
- }
- }
- if(pos - start_offset > 0)
- printbuf_memappend(pb, str + start_offset, pos - start_offset);
- return 0;
-}
-
-
-/* reference counting */
-
-extern struct json_object* json_object_get(struct json_object *jso)
-{
- if(jso) {
- jso->_ref_count++;
- }
- return jso;
-}
-
-int json_object_put(struct json_object *jso)
-{
- if(jso)
- {
- jso->_ref_count--;
- if(!jso->_ref_count)
- {
- if (jso->_user_delete)
- jso->_user_delete(jso, jso->_userdata);
- jso->_delete(jso);
- return 1;
- }
- }
- return 0;
-}
-
-
-/* generic object construction and destruction parts */
-
-static void json_object_generic_delete(struct json_object* jso)
-{
-#ifdef REFCOUNT_DEBUG
- MC_DEBUG("json_object_delete_%s: %p\n",
- json_type_to_name(jso->o_type), jso);
- lh_table_delete(json_object_table, jso);
-#endif /* REFCOUNT_DEBUG */
- printbuf_free(jso->_pb);
- free(jso);
-}
-
-static struct json_object* json_object_new(enum json_type o_type)
-{
- struct json_object *jso;
-
- jso = (struct json_object*)calloc(sizeof(struct json_object), 1);
- if(!jso) return NULL;
- jso->o_type = o_type;
- jso->_ref_count = 1;
- jso->_delete = &json_object_generic_delete;
-#ifdef REFCOUNT_DEBUG
- lh_table_insert(json_object_table, jso, jso);
- MC_DEBUG("json_object_new_%s: %p\n", json_type_to_name(jso->o_type), jso);
-#endif /* REFCOUNT_DEBUG */
- return jso;
-}
-
-
-/* type checking functions */
-
-int json_object_is_type(struct json_object *jso, enum json_type type)
-{
- if (!jso)
- return (type == json_type_null);
- return (jso->o_type == type);
-}
-
-enum json_type json_object_get_type(struct json_object *jso)
-{
- if (!jso)
- return json_type_null;
- return jso->o_type;
-}
-
-/* set a custom conversion to string */
-
-void json_object_set_serializer(json_object *jso,
- json_object_to_json_string_fn to_string_func,
- void *userdata,
- json_object_delete_fn *user_delete)
-{
- // First, clean up any previously existing user info
- if (jso->_user_delete)
- {
- jso->_user_delete(jso, jso->_userdata);
- }
- jso->_userdata = NULL;
- jso->_user_delete = NULL;
-
- if (to_string_func == NULL)
- {
- // Reset to the standard serialization function
- switch(jso->o_type)
- {
- case json_type_null:
- jso->_to_json_string = NULL;
- break;
- case json_type_boolean:
- jso->_to_json_string = &json_object_boolean_to_json_string;
- break;
- case json_type_double:
- jso->_to_json_string = &json_object_double_to_json_string;
- break;
- case json_type_int:
- jso->_to_json_string = &json_object_int_to_json_string;
- break;
- case json_type_object:
- jso->_to_json_string = &json_object_object_to_json_string;
- break;
- case json_type_array:
- jso->_to_json_string = &json_object_array_to_json_string;
- break;
- case json_type_string:
- jso->_to_json_string = &json_object_string_to_json_string;
- break;
- }
- return;
- }
-
- jso->_to_json_string = to_string_func;
- jso->_userdata = userdata;
- jso->_user_delete = user_delete;
-}
-
-
-/* extended conversion to string */
-
-const char* json_object_to_json_string_ext(struct json_object *jso, int flags)
-{
- if (!jso)
- return "null";
-
- if ((!jso->_pb) && !(jso->_pb = printbuf_new()))
- return NULL;
-
- printbuf_reset(jso->_pb);
-
- if(jso->_to_json_string(jso, jso->_pb, 0, flags) < 0)
- return NULL;
-
- return jso->_pb->buf;
-}
-
-/* backwards-compatible conversion to string */
-
-const char* json_object_to_json_string(struct json_object *jso)
-{
- return json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PLAIN);
-}
-
-static void indent(struct printbuf *pb, int level, int flags)
-{
- if (flags & JSON_C_TO_STRING_PRETTY)
- {
- printbuf_memset(pb, -1, ' ', level * 2);
- }
-}
-
-/* json_object_object */
-
-static int json_object_object_to_json_string(struct json_object* jso,
- struct printbuf *pb,
- int level,
- int flags)
-{
- int had_children = 0;
- struct json_object_iter iter;
-
- sprintbuf(pb, "{" /*}*/);
- if (flags & JSON_C_TO_STRING_PRETTY)
- sprintbuf(pb, "\n");
- json_object_object_foreachC(jso, iter)
- {
- if (had_children)
- {
- sprintbuf(pb, ",");
- if (flags & JSON_C_TO_STRING_PRETTY)
- sprintbuf(pb, "\n");
- }
- had_children = 1;
- if (flags & JSON_C_TO_STRING_SPACED)
- sprintbuf(pb, " ");
- indent(pb, level+1, flags);
- sprintbuf(pb, "\"");
- json_escape_str(pb, iter.key, strlen(iter.key));
- if (flags & JSON_C_TO_STRING_SPACED)
- sprintbuf(pb, "\": ");
- else
- sprintbuf(pb, "\":");
- if(iter.val == NULL)
- sprintbuf(pb, "null");
- else
- iter.val->_to_json_string(iter.val, pb, level+1,flags);
- }
- if (flags & JSON_C_TO_STRING_PRETTY)
- {
- if (had_children)
- sprintbuf(pb, "\n");
- indent(pb,level,flags);
- }
- if (flags & JSON_C_TO_STRING_SPACED)
- return sprintbuf(pb, /*{*/ " }");
- else
- return sprintbuf(pb, /*{*/ "}");
-}
-
-
-static void json_object_lh_entry_free(struct lh_entry *ent)
-{
- free(ent->k);
- json_object_put((struct json_object*)ent->v);
-}
-
-static void json_object_object_delete(struct json_object* jso)
-{
- lh_table_free(jso->o.c_object);
- json_object_generic_delete(jso);
-}
-
-struct json_object* json_object_new_object(void)
-{
- struct json_object *jso = json_object_new(json_type_object);
- if(!jso) return NULL;
- jso->_delete = &json_object_object_delete;
- jso->_to_json_string = &json_object_object_to_json_string;
- jso->o.c_object = lh_kchar_table_new(JSON_OBJECT_DEF_HASH_ENTRIES,
- NULL, &json_object_lh_entry_free);
- return jso;
-}
-
-struct lh_table* json_object_get_object(struct json_object *jso)
-{
- if(!jso) return NULL;
- switch(jso->o_type) {
- case json_type_object:
- return jso->o.c_object;
- default:
- return NULL;
- }
-}
-
-void json_object_object_add(struct json_object* jso, const char *key,
- struct json_object *val)
-{
- // We lookup the entry and replace the value, rather than just deleting
- // and re-adding it, so the existing key remains valid.
- json_object *existing_value = NULL;
- struct lh_entry *existing_entry;
- existing_entry = lh_table_lookup_entry(jso->o.c_object, (void*)key);
- if (!existing_entry)
- {
- lh_table_insert(jso->o.c_object, strdup(key), val);
- return;
- }
- existing_value = (void *)existing_entry->v;
- if (existing_value)
- json_object_put(existing_value);
- existing_entry->v = val;
-}
-
-int json_object_object_length(struct json_object *jso)
-{
- return lh_table_length(jso->o.c_object);
-}
-
-struct json_object* json_object_object_get(struct json_object* jso, const char *key)
-{
- struct json_object *result = NULL;
- json_object_object_get_ex(jso, key, &result);
- return result;
-}
-
-json_bool json_object_object_get_ex(struct json_object* jso, const char *key, struct json_object **value)
-{
- if (value != NULL)
- *value = NULL;
-
- if (NULL == jso)
- return FALSE;
-
- switch(jso->o_type)
- {
- case json_type_object:
- return lh_table_lookup_ex(jso->o.c_object, (void*)key, (void**)value);
- default:
- if (value != NULL)
- *value = NULL;
- return FALSE;
- }
-}
-
-void json_object_object_del(struct json_object* jso, const char *key)
-{
- lh_table_delete(jso->o.c_object, key);
-}
-
-
-/* json_object_boolean */
-
-static int json_object_boolean_to_json_string(struct json_object* jso,
- struct printbuf *pb,
- int level,
- int flags)
-{
- level = level;
- flags = flags;
- if(jso->o.c_boolean) return sprintbuf(pb, "true");
- else return sprintbuf(pb, "false");
-}
-
-struct json_object* json_object_new_boolean(json_bool b)
-{
- struct json_object *jso = json_object_new(json_type_boolean);
- if(!jso) return NULL;
- jso->_to_json_string = &json_object_boolean_to_json_string;
- jso->o.c_boolean = b;
- return jso;
-}
-
-json_bool json_object_get_boolean(struct json_object *jso)
-{
- if(!jso) return FALSE;
- switch(jso->o_type) {
- case json_type_boolean:
- return jso->o.c_boolean;
- case json_type_int:
- return (jso->o.c_int64 != 0);
- case json_type_double:
- return (jso->o.c_double != 0);
- case json_type_string:
- return (jso->o.c_string.len != 0);
- default:
- return FALSE;
- }
-}
-
-
-/* json_object_int */
-
-static int json_object_int_to_json_string(struct json_object* jso,
- struct printbuf *pb,
- int level,
- int flags)
-{
- level = level;
- flags = flags;
- return sprintbuf(pb, "%"PRId64, jso->o.c_int64);
-}
-
-struct json_object* json_object_new_int(int32_t i)
-{
- struct json_object *jso = json_object_new(json_type_int);
- if(!jso) return NULL;
- jso->_to_json_string = &json_object_int_to_json_string;
- jso->o.c_int64 = i;
- return jso;
-}
-
-int32_t json_object_get_int(struct json_object *jso)
-{
- int64_t cint64;
- enum json_type o_type;
-
- if(!jso) return 0;
-
- o_type = jso->o_type;
- cint64 = jso->o.c_int64;
-
- if (o_type == json_type_string)
- {
- /*
- * Parse strings into 64-bit numbers, then use the
- * 64-to-32-bit number handling below.
- */
- if (json_parse_int64(jso->o.c_string.str, &cint64) != 0)
- return 0; /* whoops, it didn't work. */
- o_type = json_type_int;
- }
-
- switch(o_type) {
- case json_type_int:
- /* Make sure we return the correct values for out of range numbers. */
- if (cint64 <= INT32_MIN)
- return INT32_MIN;
- else if (cint64 >= INT32_MAX)
- return INT32_MAX;
- else
- return (int32_t)cint64;
- case json_type_double:
- return (int32_t)jso->o.c_double;
- case json_type_boolean:
- return jso->o.c_boolean;
- default:
- return 0;
- }
-}
-
-struct json_object* json_object_new_int64(int64_t i)
-{
- struct json_object *jso = json_object_new(json_type_int);
- if(!jso) return NULL;
- jso->_to_json_string = &json_object_int_to_json_string;
- jso->o.c_int64 = i;
- return jso;
-}
-
-int64_t json_object_get_int64(struct json_object *jso)
-{
- int64_t cint;
-
- if(!jso) return 0;
- switch(jso->o_type) {
- case json_type_int:
- return jso->o.c_int64;
- case json_type_double:
- return (int64_t)jso->o.c_double;
- case json_type_boolean:
- return jso->o.c_boolean;
- case json_type_string:
- if (json_parse_int64(jso->o.c_string.str, &cint) == 0) return cint;
- default:
- return 0;
- }
-}
-
-
-/* json_object_double */
-
-static int json_object_double_to_json_string(struct json_object* jso,
- struct printbuf *pb,
- int level,
- int flags)
-{
- level = level;
- flags = flags;
- char buf[128], *p, *q;
- int size;
- /* Although JSON RFC does not support
- NaN or Infinity as numeric values
- ECMA 262 section 9.8.1 defines
- how to handle these cases as strings */
- if(isnan(jso->o.c_double))
- size = snprintf(buf, sizeof(buf), "NaN");
- else if(isinf(jso->o.c_double))
- if(jso->o.c_double > 0)
- size = snprintf(buf, sizeof(buf), "Infinity");
- else
- size = snprintf(buf, sizeof(buf), "-Infinity");
- else
- size = snprintf(buf, sizeof(buf), "%.17g", jso->o.c_double);
-
- p = strchr(buf, ',');
- if (p) {
- *p = '.';
- } else {
- p = strchr(buf, '.');
- }
- if (p && (flags & JSON_C_TO_STRING_NOZERO)) {
- /* last useful digit, always keep 1 zero */
- p++;
- for (q=p ; *q ; q++) {
- if (*q!='0') p=q;
- }
- /* drop trailing zeroes */
- *(++p) = 0;
- size = p-buf;
- }
- printbuf_memappend(pb, buf, size);
- return size;
-}
-
-struct json_object* json_object_new_double(double d)
-{
- struct json_object *jso = json_object_new(json_type_double);
- if (!jso)
- return NULL;
- jso->_to_json_string = &json_object_double_to_json_string;
- jso->o.c_double = d;
- return jso;
-}
-
-struct json_object* json_object_new_double_s(double d, const char *ds)
-{
- struct json_object *jso = json_object_new_double(d);
- if (!jso)
- return NULL;
-
- json_object_set_serializer(jso, json_object_userdata_to_json_string,
- strdup(ds), json_object_free_userdata);
- return jso;
-}
-
-int json_object_userdata_to_json_string(struct json_object *jso,
- struct printbuf *pb, int level, int flags)
-{
- level = level;
- flags = flags;
-
- int userdata_len = strlen(jso->_userdata);
- printbuf_memappend(pb, jso->_userdata, userdata_len);
- return userdata_len;
-}
-
-void json_object_free_userdata(struct json_object *jso, void *userdata)
-{
- jso = jso;
- free(userdata);
-}
-
-double json_object_get_double(struct json_object *jso)
-{
- double cdouble;
- char *errPtr = NULL;
-
- if(!jso) return 0.0;
- switch(jso->o_type) {
- case json_type_double:
- return jso->o.c_double;
- case json_type_int:
- return jso->o.c_int64;
- case json_type_boolean:
- return jso->o.c_boolean;
- case json_type_string:
- errno = 0;
- cdouble = strtod(jso->o.c_string.str,&errPtr);
-
- /* if conversion stopped at the first character, return 0.0 */
- if (errPtr == jso->o.c_string.str)
- return 0.0;
-
- /*
- * Check that the conversion terminated on something sensible
- *
- * For example, { "pay" : 123AB } would parse as 123.
- */
- if (*errPtr != '\0')
- return 0.0;
-
- /*
- * If strtod encounters a string which would exceed the
- * capacity of a double, it returns +/- HUGE_VAL and sets
- * errno to ERANGE. But +/- HUGE_VAL is also a valid result
- * from a conversion, so we need to check errno.
- *
- * Underflow also sets errno to ERANGE, but it returns 0 in
- * that case, which is what we will return anyway.
- *
- * See CERT guideline ERR30-C
- */
- if ((HUGE_VAL == cdouble || -HUGE_VAL == cdouble) &&
- (ERANGE == errno))
- cdouble = 0.0;
- return cdouble;
- default:
- return 0.0;
- }
-}
-
-
-/* json_object_string */
-
-static int json_object_string_to_json_string(struct json_object* jso,
- struct printbuf *pb,
- int level,
- int flags)
-{
-level = level;
-flags = flags;
-
- sprintbuf(pb, "\"");
- json_escape_str(pb, jso->o.c_string.str, jso->o.c_string.len);
- sprintbuf(pb, "\"");
- return 0;
-}
-
-static void json_object_string_delete(struct json_object* jso)
-{
- free(jso->o.c_string.str);
- json_object_generic_delete(jso);
-}
-
-struct json_object* json_object_new_string(const char *s)
-{
- struct json_object *jso = json_object_new(json_type_string);
- if(!jso) return NULL;
- jso->_delete = &json_object_string_delete;
- jso->_to_json_string = &json_object_string_to_json_string;
- jso->o.c_string.str = strdup(s);
- jso->o.c_string.len = strlen(s);
- return jso;
-}
-
-struct json_object* json_object_new_string_len(const char *s, int len)
-{
- struct json_object *jso = json_object_new(json_type_string);
- if(!jso) return NULL;
- jso->_delete = &json_object_string_delete;
- jso->_to_json_string = &json_object_string_to_json_string;
- jso->o.c_string.str = (char*)malloc(len + 1);
- memcpy(jso->o.c_string.str, (void *)s, len);
- jso->o.c_string.str[len] = '\0';
- jso->o.c_string.len = len;
- return jso;
-}
-
-const char* json_object_get_string(struct json_object *jso)
-{
- if(!jso) return NULL;
- switch(jso->o_type) {
- case json_type_string:
- return jso->o.c_string.str;
- default:
- return json_object_to_json_string(jso);
- }
-}
-
-int json_object_get_string_len(struct json_object *jso) {
- if(!jso) return 0;
- switch(jso->o_type) {
- case json_type_string:
- return jso->o.c_string.len;
- default:
- return 0;
- }
-}
-
-
-/* json_object_array */
-
-static int json_object_array_to_json_string(struct json_object* jso,
- struct printbuf *pb,
- int level,
- int flags)
-{
- int had_children = 0;
- int ii;
- sprintbuf(pb, "[");
- if (flags & JSON_C_TO_STRING_PRETTY)
- sprintbuf(pb, "\n");
- for(ii=0; ii < json_object_array_length(jso); ii++)
- {
- struct json_object *val;
- if (had_children)
- {
- sprintbuf(pb, ",");
- if (flags & JSON_C_TO_STRING_PRETTY)
- sprintbuf(pb, "\n");
- }
- had_children = 1;
- if (flags & JSON_C_TO_STRING_SPACED)
- sprintbuf(pb, " ");
- indent(pb, level + 1, flags);
- val = json_object_array_get_idx(jso, ii);
- if(val == NULL)
- sprintbuf(pb, "null");
- else
- val->_to_json_string(val, pb, level+1, flags);
- }
- if (flags & JSON_C_TO_STRING_PRETTY)
- {
- if (had_children)
- sprintbuf(pb, "\n");
- indent(pb,level,flags);
- }
-
- if (flags & JSON_C_TO_STRING_SPACED)
- return sprintbuf(pb, " ]");
- else
- return sprintbuf(pb, "]");
-}
-
-static void json_object_array_entry_free(void *data)
-{
- json_object_put((struct json_object*)data);
-}
-
-static void json_object_array_delete(struct json_object* jso)
-{
- array_list_free(jso->o.c_array);
- json_object_generic_delete(jso);
-}
-
-struct json_object* json_object_new_array(void)
-{
- struct json_object *jso = json_object_new(json_type_array);
- if(!jso) return NULL;
- jso->_delete = &json_object_array_delete;
- jso->_to_json_string = &json_object_array_to_json_string;
- jso->o.c_array = array_list_new(&json_object_array_entry_free);
- return jso;
-}
-
-struct array_list* json_object_get_array(struct json_object *jso)
-{
- if(!jso) return NULL;
- switch(jso->o_type) {
- case json_type_array:
- return jso->o.c_array;
- default:
- return NULL;
- }
-}
-
-void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *))
-{
- array_list_sort(jso->o.c_array, sort_fn);
-}
-
-int json_object_array_length(struct json_object *jso)
-{
- return array_list_length(jso->o.c_array);
-}
-
-int json_object_array_add(struct json_object *jso,struct json_object *val)
-{
- return array_list_add(jso->o.c_array, val);
-}
-
-int json_object_array_put_idx(struct json_object *jso, int idx,
- struct json_object *val)
-{
- return array_list_put_idx(jso->o.c_array, idx, val);
-}
-
-struct json_object* json_object_array_get_idx(struct json_object *jso,
- int idx)
-{
- return (struct json_object*)array_list_get_idx(jso->o.c_array, idx);
-}
-
diff --git a/src/components/json/json_object.h b/src/components/json/json_object.h
deleted file mode 100644
index 26e6b29..0000000
--- a/src/components/json/json_object.h
+++ /dev/null
@@ -1,617 +0,0 @@
-/*
- * $Id: json_object.h,v 1.12 2006/01/30 23:07:57 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef _json_object_h_
-#define _json_object_h_
-
-#ifdef __GNUC__
-#define THIS_FUNCTION_IS_DEPRECATED(func) func __attribute__ ((deprecated))
-#elif defined(_MSC_VER)
-#define THIS_FUNCTION_IS_DEPRECATED(func) __declspec(deprecated) func
-#else
-#define THIS_FUNCTION_IS_DEPRECATED(func) func
-#endif
-
-#include "json_inttypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define JSON_OBJECT_DEF_HASH_ENTRIES 16
-
-/**
- * A flag for the json_object_to_json_string_ext() and
- * json_object_to_file_ext() functions which causes the output
- * to have no extra whitespace or formatting applied.
- */
-#define JSON_C_TO_STRING_PLAIN 0
-/**
- * A flag for the json_object_to_json_string_ext() and
- * json_object_to_file_ext() functions which causes the output to have
- * minimal whitespace inserted to make things slightly more readable.
- */
-#define JSON_C_TO_STRING_SPACED (1<<0)
-/**
- * A flag for the json_object_to_json_string_ext() and
- * json_object_to_file_ext() functions which causes
- * the output to be formatted.
- *
- * See the "Two Space Tab" option at http://jsonformatter.curiousconcept.com/
- * for an example of the format.
- */
-#define JSON_C_TO_STRING_PRETTY (1<<1)
-/**
- * A flag to drop trailing zero for float values
- */
-#define JSON_C_TO_STRING_NOZERO (1<<2)
-
-#undef FALSE
-#define FALSE ((json_bool)0)
-
-#undef TRUE
-#define TRUE ((json_bool)1)
-
-extern const char *json_number_chars;
-extern const char *json_hex_chars;
-
-/* CAW: added for ANSI C iteration correctness */
-struct json_object_iter
-{
- char *key;
- struct json_object *val;
- struct lh_entry *entry;
-};
-
-/* forward structure definitions */
-
-typedef int json_bool;
-typedef struct printbuf printbuf;
-typedef struct lh_table lh_table;
-typedef struct array_list array_list;
-typedef struct json_object json_object;
-typedef struct json_object_iter json_object_iter;
-typedef struct json_tokener json_tokener;
-
-/**
- * Type of custom user delete functions. See json_object_set_serializer.
- */
-typedef void (json_object_delete_fn)(struct json_object *jso, void *userdata);
-
-/**
- * Type of a custom serialization function. See json_object_set_serializer.
- */
-typedef int (json_object_to_json_string_fn)(struct json_object *jso,
- struct printbuf *pb,
- int level,
- int flags);
-
-/* supported object types */
-
-typedef enum json_type {
- /* If you change this, be sure to update json_type_to_name() too */
- json_type_null,
- json_type_boolean,
- json_type_double,
- json_type_int,
- json_type_object,
- json_type_array,
- json_type_string,
-} json_type;
-
-/* reference counting functions */
-
-/**
- * Increment the reference count of json_object, thereby grabbing shared
- * ownership of obj.
- *
- * @param obj the json_object instance
- */
-extern struct json_object* json_object_get(struct json_object *obj);
-
-/**
- * Decrement the reference count of json_object and free if it reaches zero.
- * You must have ownership of obj prior to doing this or you will cause an
- * imbalance in the reference count.
- *
- * @param obj the json_object instance
- * @returns 1 if the object was freed.
- */
-int json_object_put(struct json_object *obj);
-
-/**
- * Check if the json_object is of a given type
- * @param obj the json_object instance
- * @param type one of:
- json_type_null (i.e. obj == NULL),
- json_type_boolean,
- json_type_double,
- json_type_int,
- json_type_object,
- json_type_array,
- json_type_string,
- */
-extern int json_object_is_type(struct json_object *obj, enum json_type type);
-
-/**
- * Get the type of the json_object. See also json_type_to_name() to turn this
- * into a string suitable, for instance, for logging.
- *
- * @param obj the json_object instance
- * @returns type being one of:
- json_type_null (i.e. obj == NULL),
- json_type_boolean,
- json_type_double,
- json_type_int,
- json_type_object,
- json_type_array,
- json_type_string,
- */
-extern enum json_type json_object_get_type(struct json_object *obj);
-
-
-/** Stringify object to json format.
- * Equivalent to json_object_to_json_string_ext(obj, JSON_C_TO_STRING_SPACED)
- * @param obj the json_object instance
- * @returns a string in JSON format
- */
-extern const char* json_object_to_json_string(struct json_object *obj);
-
-/** Stringify object to json format
- * @param obj the json_object instance
- * @param flags formatting options, see JSON_C_TO_STRING_PRETTY and other constants
- * @returns a string in JSON format
- */
-extern const char* json_object_to_json_string_ext(struct json_object *obj, int
-flags);
-
-/**
- * Set a custom serialization function to be used when this particular object
- * is converted to a string by json_object_to_json_string.
- *
- * If a custom serializer is already set on this object, any existing
- * user_delete function is called before the new one is set.
- *
- * If to_string_func is NULL, the other parameters are ignored
- * and the default behaviour is reset.
- *
- * The userdata parameter is optional and may be passed as NULL. If provided,
- * it is passed to to_string_func as-is. This parameter may be NULL even
- * if user_delete is non-NULL.
- *
- * The user_delete parameter is optional and may be passed as NULL, even if
- * the userdata parameter is non-NULL. It will be called just before the
- * json_object is deleted, after it's reference count goes to zero
- * (see json_object_put()).
- * If this is not provided, it is up to the caller to free the userdata at
- * an appropriate time. (i.e. after the json_object is deleted)
- *
- * @param jso the object to customize
- * @param to_string_func the custom serialization function
- * @param userdata an optional opaque cookie
- * @param user_delete an optional function from freeing userdata
- */
-extern void json_object_set_serializer(json_object *jso,
- json_object_to_json_string_fn to_string_func,
- void *userdata,
- json_object_delete_fn *user_delete);
-
-/**
- * Simply call free on the userdata pointer.
- * Can be used with json_object_set_serializer().
- *
- * @param jso unused
- * @param userdata the pointer that is passed to free().
- */
-json_object_delete_fn json_object_free_userdata;
-
-/**
- * Copy the jso->_userdata string over to pb as-is.
- * Can be used with json_object_set_serializer().
- *
- * @param jso The object whose _userdata is used.
- * @param pb The destination buffer.
- * @param level Ignored.
- * @param flags Ignored.
- */
-json_object_to_json_string_fn json_object_userdata_to_json_string;
-
-
-/* object type methods */
-
-/** Create a new empty object with a reference count of 1. The caller of
- * this object initially has sole ownership. Remember, when using
- * json_object_object_add or json_object_array_put_idx, ownership will
- * transfer to the object/array. Call json_object_get if you want to maintain
- * shared ownership or also add this object as a child of multiple objects or
- * arrays. Any ownerships you acquired but did not transfer must be released
- * through json_object_put.
- *
- * @returns a json_object of type json_type_object
- */
-extern struct json_object* json_object_new_object(void);
-
-/** Get the hashtable of a json_object of type json_type_object
- * @param obj the json_object instance
- * @returns a linkhash
- */
-extern struct lh_table* json_object_get_object(struct json_object *obj);
-
-/** Get the size of an object in terms of the number of fields it has.
- * @param obj the json_object whose length to return
- */
-extern int json_object_object_length(struct json_object* obj);
-
-/** Add an object field to a json_object of type json_type_object
- *
- * The reference count will *not* be incremented. This is to make adding
- * fields to objects in code more compact. If you want to retain a reference
- * to an added object, independent of the lifetime of obj, you must wrap the
- * passed object with json_object_get.
- *
- * Upon calling this, the ownership of val transfers to obj. Thus you must
- * make sure that you do in fact have ownership over this object. For instance,
- * json_object_new_object will give you ownership until you transfer it,
- * whereas json_object_object_get does not.
- *
- * @param obj the json_object instance
- * @param key the object field name (a private copy will be duplicated)
- * @param val a json_object or NULL member to associate with the given field
- */
-extern void json_object_object_add(struct json_object* obj, const char *key,
- struct json_object *val);
-
-/** Get the json_object associate with a given object field
- *
- * *No* reference counts will be changed. There is no need to manually adjust
- * reference counts through the json_object_put/json_object_get methods unless
- * you need to have the child (value) reference maintain a different lifetime
- * than the owning parent (obj). Ownership of the returned value is retained
- * by obj (do not do json_object_put unless you have done a json_object_get).
- * If you delete the value from obj (json_object_object_del) and wish to access
- * the returned reference afterwards, make sure you have first gotten shared
- * ownership through json_object_get (& don't forget to do a json_object_put
- * or transfer ownership to prevent a memory leak).
- *
- * @param obj the json_object instance
- * @param key the object field name
- * @returns the json_object associated with the given field name
- * @deprecated Please use json_object_object_get_ex
- */
- #if 0
- /** BY TSIHANG */
-THIS_FUNCTION_IS_DEPRECATED(extern struct json_object* json_object_object_get(struct json_object* obj,
- const char *key));
-#else
-extern struct json_object* json_object_object_get(struct json_object* obj,
- const char *key);
-#endif
-/** Get the json_object associated with a given object field.
- *
- * This returns true if the key is found, false in all other cases (including
- * if obj isn't a json_type_object).
- *
- * *No* reference counts will be changed. There is no need to manually adjust
- * reference counts through the json_object_put/json_object_get methods unless
- * you need to have the child (value) reference maintain a different lifetime
- * than the owning parent (obj). Ownership of value is retained by obj.
- *
- * @param obj the json_object instance
- * @param key the object field name
- * @param value a pointer where to store a reference to the json_object
- * associated with the given field name.
- *
- * It is safe to pass a NULL value.
- * @returns whether or not the key exists
- */
-extern json_bool json_object_object_get_ex(struct json_object* obj,
- const char *key,
- struct json_object **value);
-
-/** Delete the given json_object field
- *
- * The reference count will be decremented for the deleted object. If there
- * are no more owners of the value represented by this key, then the value is
- * freed. Otherwise, the reference to the value will remain in memory.
- *
- * @param obj the json_object instance
- * @param key the object field name
- */
-extern void json_object_object_del(struct json_object* obj, const char *key);
-
-/**
- * Iterate through all keys and values of an object.
- *
- * Adding keys to the object while iterating is NOT allowed.
- *
- * Deleting an existing key, or replacing an existing key with a
- * new value IS allowed.
- *
- * @param obj the json_object instance
- * @param key the local name for the char* key variable defined in the body
- * @param val the local name for the json_object* object variable defined in
- * the body
- */
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L
-
-# define json_object_object_foreach(obj,key,val) \
- char *key; \
- struct json_object *val __attribute__((__unused__)); \
- for(struct lh_entry *entry ## key = json_object_get_object(obj)->head, *entry_next ## key = NULL; \
- ({ if(entry ## key) { \
- key = (char*)entry ## key->k; \
- val = (struct json_object*)entry ## key->v; \
- entry_next ## key = entry ## key->next; \
- } ; entry ## key; }); \
- entry ## key = entry_next ## key )
-
-#else /* ANSI C or MSC */
-
-# define json_object_object_foreach(obj,key,val) \
- char *key;\
- struct json_object *val; \
- struct lh_entry *entry ## key; \
- struct lh_entry *entry_next ## key = NULL; \
- for(entry ## key = json_object_get_object(obj)->head; \
- (entry ## key ? ( \
- key = (char*)entry ## key->k, \
- val = (struct json_object*)entry ## key->v, \
- entry_next ## key = entry ## key->next, \
- entry ## key) : 0); \
- entry ## key = entry_next ## key)
-
-#endif /* defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L */
-
-/** Iterate through all keys and values of an object (ANSI C Safe)
- * @param obj the json_object instance
- * @param iter the object iterator
- */
-#define json_object_object_foreachC(obj,iter) \
- for(iter.entry = json_object_get_object(obj)->head; (iter.entry ? (iter.key = (char*)iter.entry->k, iter.val = (struct json_object*)iter.entry->v, iter.entry) : 0); iter.entry = iter.entry->next)
-
-/* Array type methods */
-
-/** Create a new empty json_object of type json_type_array
- * @returns a json_object of type json_type_array
- */
-extern struct json_object* json_object_new_array(void);
-
-/** Get the arraylist of a json_object of type json_type_array
- * @param obj the json_object instance
- * @returns an arraylist
- */
-extern struct array_list* json_object_get_array(struct json_object *obj);
-
-/** Get the length of a json_object of type json_type_array
- * @param obj the json_object instance
- * @returns an int
- */
-extern int json_object_array_length(struct json_object *obj);
-
-/** Sorts the elements of jso of type json_type_array
-*
-* Pointers to the json_object pointers will be passed as the two arguments
-* to @sort_fn
-*
-* @param obj the json_object instance
-* @param sort_fn a sorting function
-*/
-extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *));
-
-/** Add an element to the end of a json_object of type json_type_array
- *
- * The reference count will *not* be incremented. This is to make adding
- * fields to objects in code more compact. If you want to retain a reference
- * to an added object you must wrap the passed object with json_object_get
- *
- * @param obj the json_object instance
- * @param val the json_object to be added
- */
-extern int json_object_array_add(struct json_object *obj,
- struct json_object *val);
-
-/** Insert or replace an element at a specified index in an array (a json_object of type json_type_array)
- *
- * The reference count will *not* be incremented. This is to make adding
- * fields to objects in code more compact. If you want to retain a reference
- * to an added object you must wrap the passed object with json_object_get
- *
- * The reference count of a replaced object will be decremented.
- *
- * The array size will be automatically be expanded to the size of the
- * index if the index is larger than the current size.
- *
- * @param obj the json_object instance
- * @param idx the index to insert the element at
- * @param val the json_object to be added
- */
-extern int json_object_array_put_idx(struct json_object *obj, int idx,
- struct json_object *val);
-
-/** Get the element at specificed index of the array (a json_object of type json_type_array)
- * @param obj the json_object instance
- * @param idx the index to get the element at
- * @returns the json_object at the specified index (or NULL)
- */
-extern struct json_object* json_object_array_get_idx(struct json_object *obj,
- int idx);
-
-/* json_bool type methods */
-
-/** Create a new empty json_object of type json_type_boolean
- * @param b a json_bool TRUE or FALSE (0 or 1)
- * @returns a json_object of type json_type_boolean
- */
-extern struct json_object* json_object_new_boolean(json_bool b);
-
-/** Get the json_bool value of a json_object
- *
- * The type is coerced to a json_bool if the passed object is not a json_bool.
- * integer and double objects will return FALSE if there value is zero
- * or TRUE otherwise. If the passed object is a string it will return
- * TRUE if it has a non zero length. If any other object type is passed
- * TRUE will be returned if the object is not NULL.
- *
- * @param obj the json_object instance
- * @returns a json_bool
- */
-extern json_bool json_object_get_boolean(struct json_object *obj);
-
-
-/* int type methods */
-
-/** Create a new empty json_object of type json_type_int
- * Note that values are stored as 64-bit values internally.
- * To ensure the full range is maintained, use json_object_new_int64 instead.
- * @param i the integer
- * @returns a json_object of type json_type_int
- */
-extern struct json_object* json_object_new_int(int32_t i);
-
-
-/** Create a new empty json_object of type json_type_int
- * @param i the integer
- * @returns a json_object of type json_type_int
- */
-extern struct json_object* json_object_new_int64(int64_t i);
-
-
-/** Get the int value of a json_object
- *
- * The type is coerced to a int if the passed object is not a int.
- * double objects will return their integer conversion. Strings will be
- * parsed as an integer. If no conversion exists then 0 is returned
- * and errno is set to EINVAL. null is equivalent to 0 (no error values set)
- *
- * Note that integers are stored internally as 64-bit values.
- * If the value of too big or too small to fit into 32-bit, INT32_MAX or
- * INT32_MIN are returned, respectively.
- *
- * @param obj the json_object instance
- * @returns an int
- */
-extern int32_t json_object_get_int(struct json_object *obj);
-
-/** Get the int value of a json_object
- *
- * The type is coerced to a int64 if the passed object is not a int64.
- * double objects will return their int64 conversion. Strings will be
- * parsed as an int64. If no conversion exists then 0 is returned.
- *
- * NOTE: Set errno to 0 directly before a call to this function to determine
- * whether or not conversion was successful (it does not clear the value for
- * you).
- *
- * @param obj the json_object instance
- * @returns an int64
- */
-extern int64_t json_object_get_int64(struct json_object *obj);
-
-
-/* double type methods */
-
-/** Create a new empty json_object of type json_type_double
- * @param d the double
- * @returns a json_object of type json_type_double
- */
-extern struct json_object* json_object_new_double(double d);
-
-/**
- * Create a new json_object of type json_type_double, using
- * the exact serialized representation of the value.
- *
- * This allows for numbers that would otherwise get displayed
- * inefficiently (e.g. 12.3 => "12.300000000000001") to be
- * serialized with the more convenient form.
- *
- * Note: this is used by json_tokener_parse_ex() to allow for
- * an exact re-serialization of a parsed object.
- *
- * An equivalent sequence of calls is:
- * @code
- * jso = json_object_new_double(d);
- * json_object_set_serializer(d, json_object_userdata_to_json_string,
- * strdup(ds), json_object_free_userdata)
- * @endcode
- *
- * @param d the numeric value of the double.
- * @param ds the string representation of the double. This will be copied.
- */
-extern struct json_object* json_object_new_double_s(double d, const char *ds);
-
-/** Get the double floating point value of a json_object
- *
- * The type is coerced to a double if the passed object is not a double.
- * integer objects will return their double conversion. Strings will be
- * parsed as a double. If no conversion exists then 0.0 is returned and
- * errno is set to EINVAL. null is equivalent to 0 (no error values set)
- *
- * If the value is too big to fit in a double, then the value is set to
- * the closest infinity with errno set to ERANGE. If strings cannot be
- * converted to their double value, then EINVAL is set & NaN is returned.
- *
- * Arrays of length 0 are interpreted as 0 (with no error flags set).
- * Arrays of length 1 are effectively cast to the equivalent object and
- * converted using the above rules. All other arrays set the error to
- * EINVAL & return NaN.
- *
- * NOTE: Set errno to 0 directly before a call to this function to
- * determine whether or not conversion was successful (it does not clear
- * the value for you).
- *
- * @param obj the json_object instance
- * @returns a double floating point number
- */
-extern double json_object_get_double(struct json_object *obj);
-
-
-/* string type methods */
-
-/** Create a new empty json_object of type json_type_string
- *
- * A copy of the string is made and the memory is managed by the json_object
- *
- * @param s the string
- * @returns a json_object of type json_type_string
- */
-extern struct json_object* json_object_new_string(const char *s);
-
-extern struct json_object* json_object_new_string_len(const char *s, int len);
-
-/** Get the string value of a json_object
- *
- * If the passed object is not of type json_type_string then the JSON
- * representation of the object is returned.
- *
- * The returned string memory is managed by the json_object and will
- * be freed when the reference count of the json_object drops to zero.
- *
- * @param obj the json_object instance
- * @returns a string
- */
-extern const char* json_object_get_string(struct json_object *obj);
-
-/** Get the string length of a json_object
- *
- * If the passed object is not of type json_type_string then zero
- * will be returned.
- *
- * @param obj the json_object instance
- * @returns int
- */
-extern int json_object_get_string_len(struct json_object *obj);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/json/json_object_iterator.c b/src/components/json/json_object_iterator.c
deleted file mode 100644
index 7066649..0000000
--- a/src/components/json/json_object_iterator.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
-*******************************************************************************
-* @file json_object_iterator.c
-*
-* Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P.
-*
-* This library is free software; you can redistribute it and/or modify
-* it under the terms of the MIT license. See COPYING for details.
-*
-* @brief json-c forces clients to use its private data
-* structures for JSON Object iteration. This API
-* implementation corrects that by abstracting the
-* private json-c details.
-*
-*******************************************************************************
-*/
-
-#include <stddef.h>
-
-#include "json.h"
-#include "json_object_private.h"
-
-#include "json_object_iterator.h"
-
-/**
- * How It Works
- *
- * For each JSON Object, json-c maintains a linked list of zero
- * or more lh_entry (link-hash entry) structures inside the
- * Object's link-hash table (lh_table).
- *
- * Each lh_entry structure on the JSON Object's linked list
- * represents a single name/value pair. The "next" field of the
- * last lh_entry in the list is set to NULL, which terminates
- * the list.
- *
- * We represent a valid iterator that refers to an actual
- * name/value pair via a pointer to the pair's lh_entry
- * structure set as the iterator's opaque_ field.
- *
- * We follow json-c's current pair list representation by
- * representing a valid "end" iterator (one that refers past the
- * last pair) with a NULL value in the iterator's opaque_ field.
- *
- * A JSON Object without any pairs in it will have the "head"
- * field of its lh_table structure set to NULL. For such an
- * object, json_object_iter_begin will return an iterator with
- * the opaque_ field set to NULL, which is equivalent to the
- * "end" iterator.
- *
- * When iterating, we simply update the iterator's opaque_ field
- * to point to the next lh_entry structure in the linked list.
- * opaque_ will become NULL once we iterate past the last pair
- * in the list, which makes the iterator equivalent to the "end"
- * iterator.
- */
-
-/// Our current representation of the "end" iterator;
-///
-/// @note May not always be NULL
-static const void* kObjectEndIterValue = NULL;
-
-/**
- * ****************************************************************************
- */
-struct json_object_iterator
-json_object_iter_begin(struct json_object* obj)
-{
- struct json_object_iterator iter;
- struct lh_table* pTable;
-
- /// @note json_object_get_object will return NULL if passed NULL
- /// or a non-json_type_object instance
- pTable = json_object_get_object(obj);
- JASSERT(NULL != pTable);
-
- /// @note For a pair-less Object, head is NULL, which matches our
- /// definition of the "end" iterator
- iter.opaque_ = pTable->head;
- return iter;
-}
-
-/**
- * ****************************************************************************
- */
-struct json_object_iterator
-json_object_iter_end(const struct json_object* obj)
-{
- struct json_object_iterator iter;
-
- JASSERT(NULL != obj);
- JASSERT(json_object_is_type(obj, json_type_object));
-
- iter.opaque_ = kObjectEndIterValue;
-
- return iter;
-}
-
-/**
- * ****************************************************************************
- */
-void
-json_object_iter_next(struct json_object_iterator* iter)
-{
- JASSERT(NULL != iter);
- JASSERT(kObjectEndIterValue != iter->opaque_);
-
- iter->opaque_ = ((struct lh_entry *)iter->opaque_)->next;
-}
-
-
-/**
- * ****************************************************************************
- */
-const char*
-json_object_iter_peek_name(const struct json_object_iterator* iter)
-{
- JASSERT(NULL != iter);
- JASSERT(kObjectEndIterValue != iter->opaque_);
-
- return (const char*)(((struct lh_entry *)iter->opaque_)->k);
-}
-
-
-/**
- * ****************************************************************************
- */
-struct json_object*
-json_object_iter_peek_value(const struct json_object_iterator* iter)
-{
- JASSERT(NULL != iter);
- JASSERT(kObjectEndIterValue != iter->opaque_);
-
- return (struct json_object*)(((struct lh_entry *)iter->opaque_)->v);
-}
-
-
-/**
- * ****************************************************************************
- */
-json_bool
-json_object_iter_equal(const struct json_object_iterator* iter1,
- const struct json_object_iterator* iter2)
-{
- JASSERT(NULL != iter1);
- JASSERT(NULL != iter2);
-
- return (iter1->opaque_ == iter2->opaque_);
-}
-
-
-/**
- * ****************************************************************************
- */
-struct json_object_iterator
-json_object_iter_init_default(void)
-{
- struct json_object_iterator iter;
-
- /**
- * @note Make this a negative, invalid value, such that
- * accidental access to it would likely be trapped by the
- * hardware as an invalid address.
- */
- iter.opaque_ = NULL;
-
- return iter;
-}
diff --git a/src/components/json/json_object_iterator.h b/src/components/json/json_object_iterator.h
deleted file mode 100644
index 44c9fb2..0000000
--- a/src/components/json/json_object_iterator.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/**
-*******************************************************************************
-* @file json_object_iterator.h
-*
-* Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P.
-*
-* This library is free software; you can redistribute it and/or modify
-* it under the terms of the MIT license. See COPYING for details.
-*
-* @brief json-c forces clients to use its private data
-* structures for JSON Object iteration. This API
-* corrects that by abstracting the private json-c
-* details.
-*
-* API attributes: <br>
-* * Thread-safe: NO<br>
-* * Reentrant: NO
-*
-*******************************************************************************
-*/
-
-
-#ifndef JSON_OBJECT_ITERATOR_H
-#define JSON_OBJECT_ITERATOR_H
-
-#include <stddef.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Forward declaration for the opaque iterator information.
- */
-struct json_object_iter_info_;
-
-/**
- * The opaque iterator that references a name/value pair within
- * a JSON Object instance or the "end" iterator value.
- */
-struct json_object_iterator {
- const void* opaque_;
-};
-
-
-/**
- * forward declaration of json-c's JSON value instance structure
- */
-struct json_object;
-
-
-/**
- * Initializes an iterator structure to a "default" value that
- * is convenient for initializing an iterator variable to a
- * default state (e.g., initialization list in a class'
- * constructor).
- *
- * @code
- * struct json_object_iterator iter = json_object_iter_init_default();
- * MyClass() : iter_(json_object_iter_init_default())
- * @endcode
- *
- * @note The initialized value doesn't reference any specific
- * pair, is considered an invalid iterator, and MUST NOT
- * be passed to any json-c API that expects a valid
- * iterator.
- *
- * @note User and internal code MUST NOT make any assumptions
- * about and dependencies on the value of the "default"
- * iterator value.
- *
- * @return json_object_iterator
- */
-struct json_object_iterator
-json_object_iter_init_default(void);
-
-/** Retrieves an iterator to the first pair of the JSON Object.
- *
- * @warning Any modification of the underlying pair invalidates all
- * iterators to that pair.
- *
- * @param obj JSON Object instance (MUST be of type json_object)
- *
- * @return json_object_iterator If the JSON Object has at
- * least one pair, on return, the iterator refers
- * to the first pair. If the JSON Object doesn't
- * have any pairs, the returned iterator is
- * equivalent to the "end" iterator for the same
- * JSON Object instance.
- *
- * @code
- * struct json_object_iterator it;
- * struct json_object_iterator itEnd;
- * struct json_object* obj;
- *
- * obj = json_tokener_parse("{'first':'george', 'age':100}");
- * it = json_object_iter_begin(obj);
- * itEnd = json_object_iter_end(obj);
- *
- * while (!json_object_iter_equal(&it, &itEnd)) {
- * printf("%s\n",
- * json_object_iter_peek_name(&it));
- * json_object_iter_next(&it);
- * }
- *
- * @endcode
- */
-struct json_object_iterator
-json_object_iter_begin(struct json_object* obj);
-
-/** Retrieves the iterator that represents the position beyond the
- * last pair of the given JSON Object instance.
- *
- * @warning Do NOT write code that assumes that the "end"
- * iterator value is NULL, even if it is so in a
- * particular instance of the implementation.
- *
- * @note The reason we do not (and MUST NOT) provide
- * "json_object_iter_is_end(json_object_iterator* iter)"
- * type of API is because it would limit the underlying
- * representation of name/value containment (or force us
- * to add additional, otherwise unnecessary, fields to
- * the iterator structure). The "end" iterator and the
- * equality test method, on the other hand, permit us to
- * cleanly abstract pretty much any reasonable underlying
- * representation without burdening the iterator
- * structure with unnecessary data.
- *
- * @note For performance reasons, memorize the "end" iterator prior
- * to any loop.
- *
- * @param obj JSON Object instance (MUST be of type json_object)
- *
- * @return json_object_iterator On return, the iterator refers
- * to the "end" of the Object instance's pairs
- * (i.e., NOT the last pair, but "beyond the last
- * pair" value)
- */
-struct json_object_iterator
-json_object_iter_end(const struct json_object* obj);
-
-/** Returns an iterator to the next pair, if any
- *
- * @warning Any modification of the underlying pair
- * invalidates all iterators to that pair.
- *
- * @param iter [IN/OUT] Pointer to iterator that references a
- * name/value pair; MUST be a valid, non-end iterator.
- * WARNING: bad things will happen if invalid or "end"
- * iterator is passed. Upon return will contain the
- * reference to the next pair if there is one; if there
- * are no more pairs, will contain the "end" iterator
- * value, which may be compared against the return value
- * of json_object_iter_end() for the same JSON Object
- * instance.
- */
-void
-json_object_iter_next(struct json_object_iterator* iter);
-
-
-/** Returns a const pointer to the name of the pair referenced
- * by the given iterator.
- *
- * @param iter pointer to iterator that references a name/value
- * pair; MUST be a valid, non-end iterator.
- *
- * @warning bad things will happen if an invalid or
- * "end" iterator is passed.
- *
- * @return const char* Pointer to the name of the referenced
- * name/value pair. The name memory belongs to the
- * name/value pair, will be freed when the pair is
- * deleted or modified, and MUST NOT be modified or
- * freed by the user.
- */
-const char*
-json_object_iter_peek_name(const struct json_object_iterator* iter);
-
-
-/** Returns a pointer to the json-c instance representing the
- * value of the referenced name/value pair, without altering
- * the instance's reference count.
- *
- * @param iter pointer to iterator that references a name/value
- * pair; MUST be a valid, non-end iterator.
- *
- * @warning bad things will happen if invalid or
- * "end" iterator is passed.
- *
- * @return struct json_object* Pointer to the json-c value
- * instance of the referenced name/value pair; the
- * value's reference count is not changed by this
- * function: if you plan to hold on to this json-c node,
- * take a look at json_object_get() and
- * json_object_put(). IMPORTANT: json-c API represents
- * the JSON Null value as a NULL json_object instance
- * pointer.
- */
-struct json_object*
-json_object_iter_peek_value(const struct json_object_iterator* iter);
-
-
-/** Tests two iterators for equality. Typically used to test
- * for end of iteration by comparing an iterator to the
- * corresponding "end" iterator (that was derived from the same
- * JSON Object instance).
- *
- * @note The reason we do not (and MUST NOT) provide
- * "json_object_iter_is_end(json_object_iterator* iter)"
- * type of API is because it would limit the underlying
- * representation of name/value containment (or force us
- * to add additional, otherwise unnecessary, fields to
- * the iterator structure). The equality test method, on
- * the other hand, permits us to cleanly abstract pretty
- * much any reasonable underlying representation.
- *
- * @param iter1 Pointer to first valid, non-NULL iterator
- * @param iter2 POinter to second valid, non-NULL iterator
- *
- * @warning if a NULL iterator pointer or an uninitialized
- * or invalid iterator, or iterators derived from
- * different JSON Object instances are passed, bad things
- * will happen!
- *
- * @return json_bool non-zero if iterators are equal (i.e., both
- * reference the same name/value pair or are both at
- * "end"); zero if they are not equal.
- */
-json_bool
-json_object_iter_equal(const struct json_object_iterator* iter1,
- const struct json_object_iterator* iter2);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* JSON_OBJECT_ITERATOR_H */
diff --git a/src/components/json/json_object_private.h b/src/components/json/json_object_private.h
deleted file mode 100644
index 5ed791b..0000000
--- a/src/components/json/json_object_private.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * $Id: json_object_private.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef _json_object_private_h_
-#define _json_object_private_h_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef void (json_object_private_delete_fn)(struct json_object *o);
-
-struct json_object
-{
- enum json_type o_type;
- json_object_private_delete_fn *_delete;
- json_object_to_json_string_fn *_to_json_string;
- int _ref_count;
- struct printbuf *_pb;
- union data {
- json_bool c_boolean;
- double c_double;
- int64_t c_int64;
- struct lh_table *c_object;
- struct array_list *c_array;
- struct {
- char *str;
- int len;
- } c_string;
- } o;
- json_object_delete_fn *_user_delete;
- void *_userdata;
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/json/json_tokener.c b/src/components/json/json_tokener.c
deleted file mode 100644
index 7cd3af3..0000000
--- a/src/components/json/json_tokener.c
+++ /dev/null
@@ -1,888 +0,0 @@
-/*
- * $Id: json_tokener.c,v 1.20 2006/07/25 03:24:50 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- *
- * Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved.
- * The copyrights to the contents of this file are licensed under the MIT License
- * (http://www.opensource.org/licenses/mit-license.php)
- */
-
-#include "config.h"
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <ctype.h>
-#include <string.h>
-#include <limits.h>
-
-#include "bits.h"
-#include "debug.h"
-#include "printbuf.h"
-#include "arraylist.h"
-#include "json_inttypes.h"
-#include "json_object.h"
-#include "json_tokener.h"
-#include "json_util.h"
-
-#ifdef HAVE_LOCALE_H
-#include <locale.h>
-#endif /* HAVE_LOCALE_H */
-
-#if !HAVE_STRDUP && defined(_MSC_VER)
- /* MSC has the version as _strdup */
-# define strdup _strdup
-#elif !HAVE_STRDUP
-# error You do not have strdup on your system.
-#endif /* HAVE_STRDUP */
-
-#if !HAVE_STRNCASECMP && defined(_MSC_VER)
- /* MSC has the version as _strnicmp */
-# define strncasecmp _strnicmp
-#elif !HAVE_STRNCASECMP
-# error You do not have strncasecmp on your system.
-#endif /* HAVE_STRNCASECMP */
-
-/* Use C99 NAN by default; if not available, nan("") should work too. */
-#ifndef NAN
-#define NAN nan("")
-#endif /* !NAN */
-
-static const char json_null_str[] = "null";
-static const int json_null_str_len = sizeof(json_null_str) - 1;
-static const char json_inf_str[] = "Infinity";
-static const int json_inf_str_len = sizeof(json_inf_str) - 1;
-static const char json_nan_str[] = "NaN";
-static const int json_nan_str_len = sizeof(json_nan_str) - 1;
-static const char json_true_str[] = "true";
-static const int json_true_str_len = sizeof(json_true_str) - 1;
-static const char json_false_str[] = "false";
-static const int json_false_str_len = sizeof(json_false_str) - 1;
-
-static const char* json_tokener_errors[] = {
- "success",
- "continue",
- "nesting too deep",
- "unexpected end of data",
- "unexpected character",
- "null expected",
- "boolean expected",
- "number expected",
- "array value separator ',' expected",
- "quoted object property name expected",
- "object property name separator ':' expected",
- "object value separator ',' expected",
- "invalid string sequence",
- "expected comment",
- "buffer size overflow"
-};
-
-const char *json_tokener_error_desc(enum json_tokener_error jerr)
-{
- int jerr_int = (int)jerr;
- if (jerr_int < 0 || jerr_int >= (int)(sizeof(json_tokener_errors) / sizeof(json_tokener_errors[0])))
- return "Unknown error, invalid json_tokener_error value passed to json_tokener_error_desc()";
- return json_tokener_errors[jerr];
-}
-
-enum json_tokener_error json_tokener_get_error(json_tokener *tok)
-{
- return tok->err;
-}
-
-/* Stuff for decoding unicode sequences */
-#define IS_HIGH_SURROGATE(uc) (((uc) & 0xFC00) == 0xD800)
-#define IS_LOW_SURROGATE(uc) (((uc) & 0xFC00) == 0xDC00)
-#define DECODE_SURROGATE_PAIR(hi,lo) ((((hi) & 0x3FF) << 10) + ((lo) & 0x3FF) + 0x10000)
-static unsigned char utf8_replacement_char[3] = { 0xEF, 0xBF, 0xBD };
-
-struct json_tokener* json_tokener_new_ex(int depth)
-{
- struct json_tokener *tok;
-
- tok = (struct json_tokener*)calloc(1, sizeof(struct json_tokener));
- if (!tok) return NULL;
- tok->stack = (struct json_tokener_srec *)calloc(depth, sizeof(struct json_tokener_srec));
- if (!tok->stack) {
- free(tok);
- return NULL;
- }
- tok->pb = printbuf_new();
- tok->max_depth = depth;
- json_tokener_reset(tok);
- return tok;
-}
-
-struct json_tokener* json_tokener_new(void)
-{
- return json_tokener_new_ex(JSON_TOKENER_DEFAULT_DEPTH);
-}
-
-void json_tokener_free(struct json_tokener *tok)
-{
- json_tokener_reset(tok);
- if (tok->pb) printbuf_free(tok->pb);
- if (tok->stack) free(tok->stack);
- free(tok);
-}
-
-static void json_tokener_reset_level(struct json_tokener *tok, int depth)
-{
- tok->stack[depth].state = json_tokener_state_eatws;
- tok->stack[depth].saved_state = json_tokener_state_start;
- json_object_put(tok->stack[depth].current);
- tok->stack[depth].current = NULL;
- free(tok->stack[depth].obj_field_name);
- tok->stack[depth].obj_field_name = NULL;
-}
-
-void json_tokener_reset(struct json_tokener *tok)
-{
- int i;
- if (!tok)
- return;
-
- for(i = tok->depth; i >= 0; i--)
- json_tokener_reset_level(tok, i);
- tok->depth = 0;
- tok->err = json_tokener_success;
-}
-
-struct json_object* json_tokener_parse(const char *str)
-{
- enum json_tokener_error jerr_ignored;
- struct json_object* obj;
- obj = json_tokener_parse_verbose(str, &jerr_ignored);
- return obj;
-}
-
-struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error)
-{
- struct json_tokener* tok;
- struct json_object* obj;
-
- tok = json_tokener_new();
- if (!tok)
- return NULL;
- obj = json_tokener_parse_ex(tok, str, -1);
- *error = tok->err;
- if(tok->err != json_tokener_success) {
- if (obj != NULL)
- json_object_put(obj);
- obj = NULL;
- }
-
- json_tokener_free(tok);
- return obj;
-}
-
-#define state tok->stack[tok->depth].state
-#define saved_state tok->stack[tok->depth].saved_state
-#define current tok->stack[tok->depth].current
-#define obj_field_name tok->stack[tok->depth].obj_field_name
-
-/* Optimization:
- * json_tokener_parse_ex() consumed a lot of CPU in its main loop,
- * iterating character-by character. A large performance boost is
- * achieved by using tighter loops to locally handle units such as
- * comments and strings. Loops that handle an entire token within
- * their scope also gather entire strings and pass them to
- * printbuf_memappend() in a single call, rather than calling
- * printbuf_memappend() one char at a time.
- *
- * PEEK_CHAR() and ADVANCE_CHAR() macros are used for code that is
- * common to both the main loop and the tighter loops.
- */
-
-/* PEEK_CHAR(dest, tok) macro:
- * Peeks at the current char and stores it in dest.
- * Returns 1 on success, sets tok->err and returns 0 if no more chars.
- * Implicit inputs: str, len vars
- */
-#define PEEK_CHAR(dest, tok) \
- (((tok)->char_offset == len) ? \
- (((tok)->depth == 0 && state == json_tokener_state_eatws && saved_state == json_tokener_state_finish) ? \
- (((tok)->err = json_tokener_success), 0) \
- : \
- (((tok)->err = json_tokener_continue), 0) \
- ) : \
- (((dest) = *str), 1) \
- )
-
-/* ADVANCE_CHAR() macro:
- * Incrementes str & tok->char_offset.
- * For convenience of existing conditionals, returns the old value of c (0 on eof)
- * Implicit inputs: c var
- */
-#define ADVANCE_CHAR(str, tok) \
- ( ++(str), ((tok)->char_offset)++, c)
-
-
-/* End optimization macro defs */
-
-
-struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
- const char *str, int len)
-{
- struct json_object *obj = NULL;
- char c = '\1';
-#ifdef HAVE_SETLOCALE
- char *oldlocale=NULL, *tmplocale;
-
- tmplocale = setlocale(LC_NUMERIC, NULL);
- if (tmplocale) oldlocale = strdup(tmplocale);
- setlocale(LC_NUMERIC, "C");
-#endif
-
- tok->char_offset = 0;
- tok->err = json_tokener_success;
-
- /* this interface is presently not 64-bit clean due to the int len argument
- and the internal printbuf interface that takes 32-bit int len arguments
- so the function limits the maximum string size to INT32_MAX (2GB).
- If the function is called with len == -1 then strlen is called to check
- the string length is less than INT32_MAX (2GB) */
- if ((len < -1) || (len == -1 && strlen(str) > INT32_MAX)) {
- tok->err = json_tokener_error_size;
- return NULL;
- }
-
- while (PEEK_CHAR(c, tok)) {
-
- redo_char:
- switch(state) {
-
- case json_tokener_state_eatws:
- /* Advance until we change state */
- while (isspace((int)c)) {
- if ((!ADVANCE_CHAR(str, tok)) || (!PEEK_CHAR(c, tok)))
- goto out;
- }
- if(c == '/' && !(tok->flags & JSON_TOKENER_STRICT)) {
- printbuf_reset(tok->pb);
- printbuf_memappend_fast(tok->pb, &c, 1);
- state = json_tokener_state_comment_start;
- } else {
- state = saved_state;
- goto redo_char;
- }
- break;
-
- case json_tokener_state_start:
- switch(c) {
- case '{':
- state = json_tokener_state_eatws;
- saved_state = json_tokener_state_object_field_start;
- current = json_object_new_object();
- break;
- case '[':
- state = json_tokener_state_eatws;
- saved_state = json_tokener_state_array;
- current = json_object_new_array();
- break;
- case 'I':
- case 'i':
- state = json_tokener_state_inf;
- printbuf_reset(tok->pb);
- tok->st_pos = 0;
- goto redo_char;
- case 'N':
- case 'n':
- state = json_tokener_state_null; // or NaN
- printbuf_reset(tok->pb);
- tok->st_pos = 0;
- goto redo_char;
- case '\'':
- if (tok->flags & JSON_TOKENER_STRICT) {
- /* in STRICT mode only double-quote are allowed */
- tok->err = json_tokener_error_parse_unexpected;
- goto out;
- }
- case '"':
- state = json_tokener_state_string;
- printbuf_reset(tok->pb);
- tok->quote_char = c;
- break;
- case 'T':
- case 't':
- case 'F':
- case 'f':
- state = json_tokener_state_boolean;
- printbuf_reset(tok->pb);
- tok->st_pos = 0;
- goto redo_char;
-#if defined(__GNUC__)
- case '0' ... '9':
-#else
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
-#endif
- case '-':
- state = json_tokener_state_number;
- printbuf_reset(tok->pb);
- tok->is_double = 0;
- goto redo_char;
- default:
- tok->err = json_tokener_error_parse_unexpected;
- goto out;
- }
- break;
-
- case json_tokener_state_finish:
- if(tok->depth == 0) goto out;
- obj = json_object_get(current);
- json_tokener_reset_level(tok, tok->depth);
- tok->depth--;
- goto redo_char;
-
- case json_tokener_state_inf: /* aka starts with 'i' */
- {
- int size;
- int size_inf;
- int is_negative = 0;
- size = size;
- printbuf_memappend_fast(tok->pb, &c, 1);
- size = json_min(tok->st_pos+1, json_null_str_len);
- size_inf = json_min(tok->st_pos+1, json_inf_str_len);
- char *infbuf = tok->pb->buf;
- if (*infbuf == '-')
- {
- infbuf++;
- is_negative = 1;
- }
- if ((!(tok->flags & JSON_TOKENER_STRICT) &&
- strncasecmp(json_inf_str, infbuf, size_inf) == 0) ||
- (strncmp(json_inf_str, infbuf, size_inf) == 0)
- )
- {
- if (tok->st_pos == json_inf_str_len)
- {
- current = json_object_new_double(is_negative ? -INFINITY : INFINITY);
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- goto redo_char;
- }
- } else {
- tok->err = json_tokener_error_parse_unexpected;
- goto out;
- }
- tok->st_pos++;
- }
- break;
- case json_tokener_state_null: /* aka starts with 'n' */
- {
- int size;
- int size_nan;
- printbuf_memappend_fast(tok->pb, &c, 1);
- size = json_min(tok->st_pos+1, json_null_str_len);
- size_nan = json_min(tok->st_pos+1, json_nan_str_len);
- if((!(tok->flags & JSON_TOKENER_STRICT) &&
- strncasecmp(json_null_str, tok->pb->buf, size) == 0)
- || (strncmp(json_null_str, tok->pb->buf, size) == 0)
- ) {
- if (tok->st_pos == json_null_str_len) {
- current = NULL;
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- goto redo_char;
- }
- }
- else if ((!(tok->flags & JSON_TOKENER_STRICT) &&
- strncasecmp(json_nan_str, tok->pb->buf, size_nan) == 0) ||
- (strncmp(json_nan_str, tok->pb->buf, size_nan) == 0)
- )
- {
- if (tok->st_pos == json_nan_str_len)
- {
- current = json_object_new_double(NAN);
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- goto redo_char;
- }
- } else {
- tok->err = json_tokener_error_parse_null;
- goto out;
- }
- tok->st_pos++;
- }
- break;
-
- case json_tokener_state_comment_start:
- if(c == '*') {
- state = json_tokener_state_comment;
- } else if(c == '/') {
- state = json_tokener_state_comment_eol;
- } else {
- tok->err = json_tokener_error_parse_comment;
- goto out;
- }
- printbuf_memappend_fast(tok->pb, &c, 1);
- break;
-
- case json_tokener_state_comment:
- {
- /* Advance until we change state */
- const char *case_start = str;
- while(c != '*') {
- if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
- printbuf_memappend_fast(tok->pb, case_start, str-case_start);
- goto out;
- }
- }
- printbuf_memappend_fast(tok->pb, case_start, 1+str-case_start);
- state = json_tokener_state_comment_end;
- }
- break;
-
- case json_tokener_state_comment_eol:
- {
- /* Advance until we change state */
- const char *case_start = str;
- while(c != '\n') {
- if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
- printbuf_memappend_fast(tok->pb, case_start, str-case_start);
- goto out;
- }
- }
- printbuf_memappend_fast(tok->pb, case_start, str-case_start);
- MC_DEBUG("json_tokener_comment: %s\n", tok->pb->buf);
- state = json_tokener_state_eatws;
- }
- break;
-
- case json_tokener_state_comment_end:
- printbuf_memappend_fast(tok->pb, &c, 1);
- if(c == '/') {
- MC_DEBUG("json_tokener_comment: %s\n", tok->pb->buf);
- state = json_tokener_state_eatws;
- } else {
- state = json_tokener_state_comment;
- }
- break;
-
- case json_tokener_state_string:
- {
- /* Advance until we change state */
- const char *case_start = str;
- while(1) {
- if(c == tok->quote_char) {
- printbuf_memappend_fast(tok->pb, case_start, str-case_start);
- current = json_object_new_string_len(tok->pb->buf, tok->pb->bpos);
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- break;
- } else if(c == '\\') {
- printbuf_memappend_fast(tok->pb, case_start, str-case_start);
- saved_state = json_tokener_state_string;
- state = json_tokener_state_string_escape;
- break;
- }
- if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
- printbuf_memappend_fast(tok->pb, case_start, str-case_start);
- goto out;
- }
- }
- }
- break;
-
- case json_tokener_state_string_escape:
- switch(c) {
- case '"':
- case '\\':
- case '/':
- printbuf_memappend_fast(tok->pb, &c, 1);
- state = saved_state;
- break;
- case 'b':
- case 'n':
- case 'r':
- case 't':
- case 'f':
- if(c == 'b') printbuf_memappend_fast(tok->pb, "\b", 1);
- else if(c == 'n') printbuf_memappend_fast(tok->pb, "\n", 1);
- else if(c == 'r') printbuf_memappend_fast(tok->pb, "\r", 1);
- else if(c == 't') printbuf_memappend_fast(tok->pb, "\t", 1);
- else if(c == 'f') printbuf_memappend_fast(tok->pb, "\f", 1);
- state = saved_state;
- break;
- case 'u':
- tok->ucs_char = 0;
- tok->st_pos = 0;
- state = json_tokener_state_escape_unicode;
- break;
- default:
- tok->err = json_tokener_error_parse_string;
- goto out;
- }
- break;
-
- case json_tokener_state_escape_unicode:
- {
- unsigned int got_hi_surrogate = 0;
-
- /* Handle a 4-byte sequence, or two sequences if a surrogate pair */
- while(1) {
- if(strchr(json_hex_chars, c)) {
- tok->ucs_char += ((unsigned int)hexdigit(c) << ((3-tok->st_pos++)*4));
- if(tok->st_pos == 4) {
- unsigned char unescaped_utf[4];
-
- if (got_hi_surrogate) {
- if (IS_LOW_SURROGATE(tok->ucs_char)) {
- /* Recalculate the ucs_char, then fall thru to process normally */
- tok->ucs_char = DECODE_SURROGATE_PAIR(got_hi_surrogate, tok->ucs_char);
- } else {
- /* Hi surrogate was not followed by a low surrogate */
- /* Replace the hi and process the rest normally */
- printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
- }
- got_hi_surrogate = 0;
- }
-
- if (tok->ucs_char < 0x80) {
- unescaped_utf[0] = tok->ucs_char;
- printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 1);
- } else if (tok->ucs_char < 0x800) {
- unescaped_utf[0] = 0xc0 | (tok->ucs_char >> 6);
- unescaped_utf[1] = 0x80 | (tok->ucs_char & 0x3f);
- printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 2);
- } else if (IS_HIGH_SURROGATE(tok->ucs_char)) {
- /* Got a high surrogate. Remember it and look for the
- * the beginning of another sequence, which should be the
- * low surrogate.
- */
- got_hi_surrogate = tok->ucs_char;
- /* Not at end, and the next two chars should be "\u" */
- if ((tok->char_offset+1 != len) &&
- (tok->char_offset+2 != len) &&
- (str[1] == '\\') &&
- (str[2] == 'u'))
- {
- /* Advance through the 16 bit surrogate, and move on to the
- * next sequence. The next step is to process the following
- * characters.
- */
- if( !ADVANCE_CHAR(str, tok) || !ADVANCE_CHAR(str, tok) ) {
- printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
- }
- /* Advance to the first char of the next sequence and
- * continue processing with the next sequence.
- */
- if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
- printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
- goto out;
- }
- tok->ucs_char = 0;
- tok->st_pos = 0;
- continue; /* other json_tokener_state_escape_unicode */
- } else {
- /* Got a high surrogate without another sequence following
- * it. Put a replacement char in for the hi surrogate
- * and pretend we finished.
- */
- printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
- }
- } else if (IS_LOW_SURROGATE(tok->ucs_char)) {
- /* Got a low surrogate not preceded by a high */
- printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
- } else if (tok->ucs_char < 0x10000) {
- unescaped_utf[0] = 0xe0 | (tok->ucs_char >> 12);
- unescaped_utf[1] = 0x80 | ((tok->ucs_char >> 6) & 0x3f);
- unescaped_utf[2] = 0x80 | (tok->ucs_char & 0x3f);
- printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 3);
- } else if (tok->ucs_char < 0x110000) {
- unescaped_utf[0] = 0xf0 | ((tok->ucs_char >> 18) & 0x07);
- unescaped_utf[1] = 0x80 | ((tok->ucs_char >> 12) & 0x3f);
- unescaped_utf[2] = 0x80 | ((tok->ucs_char >> 6) & 0x3f);
- unescaped_utf[3] = 0x80 | (tok->ucs_char & 0x3f);
- printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 4);
- } else {
- /* Don't know what we got--insert the replacement char */
- printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
- }
- state = saved_state;
- break;
- }
- } else {
- tok->err = json_tokener_error_parse_string;
- goto out;
- }
- if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
- if (got_hi_surrogate) /* Clean up any pending chars */
- printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
- goto out;
- }
- }
- }
- break;
-
- case json_tokener_state_boolean:
- {
- int size1, size2;
- printbuf_memappend_fast(tok->pb, &c, 1);
- size1 = json_min(tok->st_pos+1, json_true_str_len);
- size2 = json_min(tok->st_pos+1, json_false_str_len);
- if((!(tok->flags & JSON_TOKENER_STRICT) &&
- strncasecmp(json_true_str, tok->pb->buf, size1) == 0)
- || (strncmp(json_true_str, tok->pb->buf, size1) == 0)
- ) {
- if(tok->st_pos == json_true_str_len) {
- current = json_object_new_boolean(1);
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- goto redo_char;
- }
- } else if((!(tok->flags & JSON_TOKENER_STRICT) &&
- strncasecmp(json_false_str, tok->pb->buf, size2) == 0)
- || (strncmp(json_false_str, tok->pb->buf, size2) == 0)) {
- if(tok->st_pos == json_false_str_len) {
- current = json_object_new_boolean(0);
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- goto redo_char;
- }
- } else {
- tok->err = json_tokener_error_parse_boolean;
- goto out;
- }
- tok->st_pos++;
- }
- break;
-
- case json_tokener_state_number:
- {
- /* Advance until we change state */
- const char *case_start = str;
- int case_len=0;
- while(c && strchr(json_number_chars, c)) {
- ++case_len;
- if(c == '.' || c == 'e' || c == 'E')
- tok->is_double = 1;
- if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
- printbuf_memappend_fast(tok->pb, case_start, case_len);
- goto out;
- }
- }
- if (case_len>0)
- printbuf_memappend_fast(tok->pb, case_start, case_len);
-
- // Check for -Infinity
- if (tok->pb->buf[0] == '-' && case_len == 1 &&
- (c == 'i' || c == 'I'))
- {
- state = json_tokener_state_inf;
- goto redo_char;
- }
- }
- {
- int64_t num64;
- double numd;
- if (!tok->is_double && json_parse_int64(tok->pb->buf, &num64) == 0) {
- if (num64 && tok->pb->buf[0]=='0' && (tok->flags & JSON_TOKENER_STRICT)) {
- /* in strict mode, number must not start with 0 */
- tok->err = json_tokener_error_parse_number;
- goto out;
- }
- current = json_object_new_int64(num64);
- }
- else if(tok->is_double && json_parse_double(tok->pb->buf, &numd) == 0)
- {
- current = json_object_new_double_s(numd, tok->pb->buf);
- } else {
- tok->err = json_tokener_error_parse_number;
- goto out;
- }
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- goto redo_char;
- }
- break;
-
- case json_tokener_state_array_after_sep:
- case json_tokener_state_array:
- if(c == ']') {
- if (state == json_tokener_state_array_after_sep &&
- (tok->flags & JSON_TOKENER_STRICT))
- {
- tok->err = json_tokener_error_parse_unexpected;
- goto out;
- }
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- } else {
- if(tok->depth >= tok->max_depth-1) {
- tok->err = json_tokener_error_depth;
- goto out;
- }
- state = json_tokener_state_array_add;
- tok->depth++;
- json_tokener_reset_level(tok, tok->depth);
- goto redo_char;
- }
- break;
-
- case json_tokener_state_array_add:
- json_object_array_add(current, obj);
- saved_state = json_tokener_state_array_sep;
- state = json_tokener_state_eatws;
- goto redo_char;
-
- case json_tokener_state_array_sep:
- if(c == ']') {
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- } else if(c == ',') {
- saved_state = json_tokener_state_array_after_sep;
- state = json_tokener_state_eatws;
- } else {
- tok->err = json_tokener_error_parse_array;
- goto out;
- }
- break;
-
- case json_tokener_state_object_field_start:
- case json_tokener_state_object_field_start_after_sep:
- if(c == '}') {
- if (state == json_tokener_state_object_field_start_after_sep &&
- (tok->flags & JSON_TOKENER_STRICT))
- {
- tok->err = json_tokener_error_parse_unexpected;
- goto out;
- }
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- } else if (c == '"' || c == '\'') {
- tok->quote_char = c;
- printbuf_reset(tok->pb);
- state = json_tokener_state_object_field;
- } else {
- tok->err = json_tokener_error_parse_object_key_name;
- goto out;
- }
- break;
-
- case json_tokener_state_object_field:
- {
- /* Advance until we change state */
- const char *case_start = str;
- while(1) {
- if(c == tok->quote_char) {
- printbuf_memappend_fast(tok->pb, case_start, str-case_start);
- obj_field_name = strdup(tok->pb->buf);
- saved_state = json_tokener_state_object_field_end;
- state = json_tokener_state_eatws;
- break;
- } else if(c == '\\') {
- printbuf_memappend_fast(tok->pb, case_start, str-case_start);
- saved_state = json_tokener_state_object_field;
- state = json_tokener_state_string_escape;
- break;
- }
- if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
- printbuf_memappend_fast(tok->pb, case_start, str-case_start);
- goto out;
- }
- }
- }
- break;
-
- case json_tokener_state_object_field_end:
- if(c == ':') {
- saved_state = json_tokener_state_object_value;
- state = json_tokener_state_eatws;
- } else {
- tok->err = json_tokener_error_parse_object_key_sep;
- goto out;
- }
- break;
-
- case json_tokener_state_object_value:
- if(tok->depth >= tok->max_depth-1) {
- tok->err = json_tokener_error_depth;
- goto out;
- }
- state = json_tokener_state_object_value_add;
- tok->depth++;
- json_tokener_reset_level(tok, tok->depth);
- goto redo_char;
-
- case json_tokener_state_object_value_add:
- json_object_object_add(current, obj_field_name, obj);
- free(obj_field_name);
- obj_field_name = NULL;
- saved_state = json_tokener_state_object_sep;
- state = json_tokener_state_eatws;
- goto redo_char;
-
- case json_tokener_state_object_sep:
- if(c == '}') {
- saved_state = json_tokener_state_finish;
- state = json_tokener_state_eatws;
- } else if(c == ',') {
- saved_state = json_tokener_state_object_field_start_after_sep;
- state = json_tokener_state_eatws;
- } else {
- tok->err = json_tokener_error_parse_object_value_sep;
- goto out;
- }
- break;
-
- }
- if (!ADVANCE_CHAR(str, tok))
- goto out;
- } /* while(POP_CHAR) */
-
- out:
- if (c &&
- (state == json_tokener_state_finish) &&
- (tok->depth == 0) &&
- (tok->flags & JSON_TOKENER_STRICT)) {
- /* unexpected char after JSON data */
- tok->err = json_tokener_error_parse_unexpected;
- }
- if (!c) { /* We hit an eof char (0) */
- if(state != json_tokener_state_finish &&
- saved_state != json_tokener_state_finish)
- tok->err = json_tokener_error_parse_eof;
- }
-
-#ifdef HAVE_SETLOCALE
- setlocale(LC_NUMERIC, oldlocale);
- if (oldlocale) free(oldlocale);
-#endif
-
- if (tok->err == json_tokener_success)
- {
- json_object *ret = json_object_get(current);
- int ii;
-
- /* Partially reset, so we parse additional objects on subsequent calls. */
- for(ii = tok->depth; ii >= 0; ii--)
- json_tokener_reset_level(tok, ii);
- return ret;
- }
-
- MC_DEBUG("json_tokener_parse_ex: error %s at offset %d\n",
- json_tokener_errors[tok->err], tok->char_offset);
- return NULL;
-}
-
-void json_tokener_set_flags(struct json_tokener *tok, int flags)
-{
- tok->flags = flags;
-}
diff --git a/src/components/json/json_tokener.h b/src/components/json/json_tokener.h
deleted file mode 100644
index a72d2bd..0000000
--- a/src/components/json/json_tokener.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * $Id: json_tokener.h,v 1.10 2006/07/25 03:24:50 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef _json_tokener_h_
-#define _json_tokener_h_
-
-#include <stddef.h>
-#include "json_object.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-enum json_tokener_error {
- json_tokener_success,
- json_tokener_continue,
- json_tokener_error_depth,
- json_tokener_error_parse_eof,
- json_tokener_error_parse_unexpected,
- json_tokener_error_parse_null,
- json_tokener_error_parse_boolean,
- json_tokener_error_parse_number,
- json_tokener_error_parse_array,
- json_tokener_error_parse_object_key_name,
- json_tokener_error_parse_object_key_sep,
- json_tokener_error_parse_object_value_sep,
- json_tokener_error_parse_string,
- json_tokener_error_parse_comment,
- json_tokener_error_size
-};
-
-enum json_tokener_state {
- json_tokener_state_eatws,
- json_tokener_state_start,
- json_tokener_state_finish,
- json_tokener_state_null,
- json_tokener_state_comment_start,
- json_tokener_state_comment,
- json_tokener_state_comment_eol,
- json_tokener_state_comment_end,
- json_tokener_state_string,
- json_tokener_state_string_escape,
- json_tokener_state_escape_unicode,
- json_tokener_state_boolean,
- json_tokener_state_number,
- json_tokener_state_array,
- json_tokener_state_array_add,
- json_tokener_state_array_sep,
- json_tokener_state_object_field_start,
- json_tokener_state_object_field,
- json_tokener_state_object_field_end,
- json_tokener_state_object_value,
- json_tokener_state_object_value_add,
- json_tokener_state_object_sep,
- json_tokener_state_array_after_sep,
- json_tokener_state_object_field_start_after_sep,
- json_tokener_state_inf
-};
-
-struct json_tokener_srec
-{
- enum json_tokener_state state, saved_state;
- struct json_object *obj;
- struct json_object *current;
- char *obj_field_name;
-};
-
-#define JSON_TOKENER_DEFAULT_DEPTH 32
-
-struct json_tokener
-{
- char *str;
- struct printbuf *pb;
- int max_depth, depth, is_double, st_pos, char_offset;
- enum json_tokener_error err;
- unsigned int ucs_char;
- char quote_char;
- struct json_tokener_srec *stack;
- int flags;
-};
-
-/**
- * Be strict when parsing JSON input. Use caution with
- * this flag as what is considered valid may become more
- * restrictive from one release to the next, causing your
- * code to fail on previously working input.
- *
- * This flag is not set by default.
- *
- * @see json_tokener_set_flags()
- */
-#define JSON_TOKENER_STRICT 0x01
-
-/**
- * Given an error previously returned by json_tokener_get_error(),
- * return a human readable description of the error.
- *
- * @return a generic error message is returned if an invalid error value is provided.
- */
-const char *json_tokener_error_desc(enum json_tokener_error jerr);
-
-/**
- * Retrieve the error caused by the last call to json_tokener_parse_ex(),
- * or json_tokener_success if there is no error.
- *
- * When parsing a JSON string in pieces, if the tokener is in the middle
- * of parsing this will return json_tokener_continue.
- *
- * See also json_tokener_error_desc().
- */
-enum json_tokener_error json_tokener_get_error(struct json_tokener *tok);
-
-extern struct json_tokener* json_tokener_new(void);
-extern struct json_tokener* json_tokener_new_ex(int depth);
-extern void json_tokener_free(struct json_tokener *tok);
-extern void json_tokener_reset(struct json_tokener *tok);
-extern struct json_object* json_tokener_parse(const char *str);
-extern struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error);
-
-/**
- * Set flags that control how parsing will be done.
- */
-extern void json_tokener_set_flags(struct json_tokener *tok, int flags);
-
-/**
- * Parse a string and return a non-NULL json_object if a valid JSON value
- * is found. The string does not need to be a JSON object or array;
- * it can also be a string, number or boolean value.
- *
- * A partial JSON string can be parsed. If the parsing is incomplete,
- * NULL will be returned and json_tokener_get_error() will be return
- * json_tokener_continue.
- * json_tokener_parse_ex() can then be called with additional bytes in str
- * to continue the parsing.
- *
- * If json_tokener_parse_ex() returns NULL and the error anything other than
- * json_tokener_continue, a fatal error has occurred and parsing must be
- * halted. Then tok object must not be re-used until json_tokener_reset() is
- * called.
- *
- * When a valid JSON value is parsed, a non-NULL json_object will be
- * returned. Also, json_tokener_get_error() will return json_tokener_success.
- * Be sure to check the type with json_object_is_type() or
- * json_object_get_type() before using the object.
- *
- * @b XXX this shouldn't use internal fields:
- * Trailing characters after the parsed value do not automatically cause an
- * error. It is up to the caller to decide whether to treat this as an
- * error or to handle the additional characters, perhaps by parsing another
- * json value starting from that point.
- *
- * Extra characters can be detected by comparing the tok->char_offset against
- * the length of the last len parameter passed in.
- *
- * The tokener does \b not maintain an internal buffer so the caller is
- * responsible for calling json_tokener_parse_ex with an appropriate str
- * parameter starting with the extra characters.
- *
- * This interface is presently not 64-bit clean due to the int len argument
- * so the function limits the maximum string size to INT32_MAX (2GB).
- * If the function is called with len == -1 then strlen is called to check
- * the string length is less than INT32_MAX (2GB)
- *
- * Example:
- * @code
-json_object *jobj = NULL;
-const char *mystring = NULL;
-int stringlen = 0;
-enum json_tokener_error jerr;
-do {
- mystring = ... // get JSON string, e.g. read from file, etc...
- stringlen = strlen(mystring);
- jobj = json_tokener_parse_ex(tok, mystring, stringlen);
-} while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue);
-if (jerr != json_tokener_success)
-{
- fprintf(stderr, "Error: %s\n", json_tokener_error_desc(jerr));
- // Handle errors, as appropriate for your application.
-}
-if (tok->char_offset < stringlen) // XXX shouldn't access internal fields
-{
- // Handle extra characters after parsed object as desired.
- // e.g. issue an error, parse another object from that point, etc...
-}
-// Success, use jobj here.
-
-@endcode
- *
- * @param tok a json_tokener previously allocated with json_tokener_new()
- * @param str an string with any valid JSON expression, or portion of. This does not need to be null terminated.
- * @param len the length of str
- */
-extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
- const char *str, int len);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/json/json_util.c b/src/components/json/json_util.c
deleted file mode 100644
index 531f9af..0000000
--- a/src/components/json/json_util.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * $Id: json_util.c,v 1.4 2006/01/30 23:07:57 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#include "config.h"
-#undef realloc
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <limits.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif /* HAVE_SYS_TYPES_H */
-
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif /* HAVE_SYS_STAT_H */
-
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif /* HAVE_FCNTL_H */
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif /* HAVE_UNISTD_H */
-
-#ifdef WIN32
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-# include <io.h>
-#endif /* defined(WIN32) */
-
-#if !defined(HAVE_OPEN) && defined(WIN32)
-# define open _open
-#endif
-
-#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER)
- /* MSC has the version as _snprintf */
-# define snprintf _snprintf
-#elif !defined(HAVE_SNPRINTF)
-# error You do not have snprintf on your system.
-#endif /* HAVE_SNPRINTF */
-
-#include "bits.h"
-#include "debug.h"
-#include "printbuf.h"
-#include "json_inttypes.h"
-#include "json_object.h"
-#include "json_tokener.h"
-#include "json_util.h"
-
-static int sscanf_is_broken = 0;
-static int sscanf_is_broken_testdone = 0;
-static void sscanf_is_broken_test(void);
-
-struct json_object* json_object_from_file(const char *filename)
-{
- struct printbuf *pb;
- struct json_object *obj;
- char buf[JSON_FILE_BUF_SIZE];
- int fd, ret;
-
- if((fd = open(filename, O_RDONLY)) < 0) {
- MC_ERROR("json_object_from_file: error opening file %s: %s\n",
- filename, strerror(errno));
- return NULL;
- }
- if(!(pb = printbuf_new())) {
- close(fd);
- MC_ERROR("json_object_from_file: printbuf_new failed\n");
- return NULL;
- }
- while((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) {
- printbuf_memappend(pb, buf, ret);
- }
- close(fd);
- if(ret < 0) {
- MC_ERROR("json_object_from_file: error reading file %s: %s\n",
- filename, strerror(errno));
- printbuf_free(pb);
- return NULL;
- }
- obj = json_tokener_parse(pb->buf);
- printbuf_free(pb);
- return obj;
-}
-
-/* extended "format and write to file" function */
-
-int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags)
-{
- const char *json_str;
- int fd, ret;
- unsigned int wpos, wsize;
-
- if(!obj) {
- MC_ERROR("json_object_to_file: object is null\n");
- return -1;
- }
-
- if((fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0) {
- MC_ERROR("json_object_to_file: error opening file %s: %s\n",
- filename, strerror(errno));
- return -1;
- }
-
- if(!(json_str = json_object_to_json_string_ext(obj,flags))) {
- close(fd);
- return -1;
- }
-
- wsize = (unsigned int)(strlen(json_str) & UINT_MAX); /* CAW: probably unnecessary, but the most 64bit safe */
- wpos = 0;
- while(wpos < wsize) {
- if((ret = write(fd, json_str + wpos, wsize-wpos)) < 0) {
- close(fd);
- MC_ERROR("json_object_to_file: error writing file %s: %s\n",
- filename, strerror(errno));
- return -1;
- }
-
- /* because of the above check for ret < 0, we can safely cast and add */
- wpos += (unsigned int)ret;
- }
-
- close(fd);
- return 0;
-}
-
-// backwards compatible "format and write to file" function
-
-int json_object_to_file(const char *filename, struct json_object *obj)
-{
- return json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN);
-}
-
-int json_parse_double(const char *buf, double *retval)
-{
- return (sscanf(buf, "%lf", retval)==1 ? 0 : 1);
-}
-
-/*
- * Not all implementations of sscanf actually work properly.
- * Check whether the one we're currently using does, and if
- * it's broken, enable the workaround code.
- */
-static void sscanf_is_broken_test()
-{
- int64_t num64;
- int ret_errno, is_int64_min, ret_errno2, is_int64_max;
-
- (void)sscanf(" -01234567890123456789012345", "%" SCNd64, &num64);
- ret_errno = errno;
- is_int64_min = (num64 == INT64_MIN);
-
- (void)sscanf(" 01234567890123456789012345", "%" SCNd64, &num64);
- ret_errno2 = errno;
- is_int64_max = (num64 == INT64_MAX);
-
- if (ret_errno != ERANGE || !is_int64_min ||
- ret_errno2 != ERANGE || !is_int64_max)
- {
- MC_DEBUG("sscanf_is_broken_test failed, enabling workaround code\n");
- sscanf_is_broken = 1;
- }
-}
-
-int json_parse_int64(const char *buf, int64_t *retval)
-{
- int64_t num64;
- const char *buf_sig_digits;
- int orig_has_neg;
- int saved_errno;
-
- if (!sscanf_is_broken_testdone)
- {
- sscanf_is_broken_test();
- sscanf_is_broken_testdone = 1;
- }
-
- // Skip leading spaces
- while (isspace((int)*buf) && *buf)
- buf++;
-
- errno = 0; // sscanf won't always set errno, so initialize
- if (sscanf(buf, "%" SCNd64, &num64) != 1)
- {
- MC_DEBUG("Failed to parse, sscanf != 1\n");
- return 1;
- }
-
- saved_errno = errno;
- buf_sig_digits = buf;
- orig_has_neg = 0;
- if (*buf_sig_digits == '-')
- {
- buf_sig_digits++;
- orig_has_neg = 1;
- }
-
- // Not all sscanf implementations actually work
- if (sscanf_is_broken && saved_errno != ERANGE)
- {
- char buf_cmp[100];
- char *buf_cmp_start = buf_cmp;
- int recheck_has_neg = 0;
- int buf_cmp_len;
-
- // Skip leading zeros, but keep at least one digit
- while (buf_sig_digits[0] == '0' && buf_sig_digits[1] != '\0')
- buf_sig_digits++;
- if (num64 == 0) // assume all sscanf impl's will parse -0 to 0
- orig_has_neg = 0; // "-0" is the same as just plain "0"
-
- snprintf(buf_cmp_start, sizeof(buf_cmp), "%" PRId64, num64);
- if (*buf_cmp_start == '-')
- {
- recheck_has_neg = 1;
- buf_cmp_start++;
- }
- // No need to skip leading spaces or zeros here.
-
- buf_cmp_len = strlen(buf_cmp_start);
- /**
- * If the sign is different, or
- * some of the digits are different, or
- * there is another digit present in the original string
- * then we have NOT successfully parsed the value.
- */
- if (orig_has_neg != recheck_has_neg ||
- strncmp(buf_sig_digits, buf_cmp_start, strlen(buf_cmp_start)) != 0 ||
- ((int)strlen(buf_sig_digits) != buf_cmp_len &&
- isdigit((int)buf_sig_digits[buf_cmp_len])
- )
- )
- {
- saved_errno = ERANGE;
- }
- }
-
- // Not all sscanf impl's set the value properly when out of range.
- // Always do this, even for properly functioning implementations,
- // since it shouldn't slow things down much.
- if (saved_errno == ERANGE)
- {
- if (orig_has_neg)
- num64 = INT64_MIN;
- else
- num64 = INT64_MAX;
- }
- *retval = num64;
- return 0;
-}
-
-#ifndef HAVE_REALLOC
-void* rpl_realloc(void* p, size_t n)
-{
- if (n == 0)
- n = 1;
- if (p == 0)
- return malloc(n);
- return realloc(p, n);
-}
-#endif
-
-#define NELEM(a) (sizeof(a) / sizeof(a[0]))
-static const char* json_type_name[] = {
- /* If you change this, be sure to update the enum json_type definition too */
- "null",
- "boolean",
- "double",
- "int",
- "object",
- "array",
- "string",
-};
-
-const char *json_type_to_name(enum json_type o_type)
-{
- int o_type_int = (int)o_type;
- if (o_type_int < 0 || o_type_int >= (int)NELEM(json_type_name))
- {
- MC_ERROR("json_type_to_name: type %d is out of range [0,%d]\n", o_type, NELEM(json_type_name));
- return NULL;
- }
- return json_type_name[o_type];
-}
-
diff --git a/src/components/json/json_util.h b/src/components/json/json_util.h
deleted file mode 100644
index 1005e58..0000000
--- a/src/components/json/json_util.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * $Id: json_util.h,v 1.4 2006/01/30 23:07:57 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef _json_util_h_
-#define _json_util_h_
-
-#include "json_object.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define JSON_FILE_BUF_SIZE 4096
-
-/* utility functions */
-extern struct json_object* json_object_from_file(const char *filename);
-extern int json_object_to_file(const char *filename, struct json_object *obj);
-extern int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags);
-extern int json_parse_int64(const char *buf, int64_t *retval);
-extern int json_parse_double(const char *buf, double *retval);
-
-
-/**
- * Return a string describing the type of the object.
- * e.g. "int", or "object", etc...
- */
-extern const char *json_type_to_name(enum json_type o_type);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/json/libjson.c b/src/components/json/libjson.c
deleted file mode 100644
index 5284fd0..0000000
--- a/src/components/json/libjson.c
+++ /dev/null
@@ -1,26 +0,0 @@
-
-/* dummy source file for compatibility purposes */
-
-#if defined(HAVE_CDEFS_H)
-#include <sys/cdefs.h>
-#endif
-
-#ifndef __warn_references
-
-#if defined(__GNUC__) && defined (HAS_GNU_WARNING_LONG)
-
-#define __warn_references(sym,msg) \
- __asm__(".section .gnu" #sym ",\n\t.ascii \"" msg "\"\n\t.text");
-
-#else
-#define __warn_references(sym,msg) /* nothing */
-#endif
-
-#endif
-
-#include "json_object.h"
-
-__warn_references(json_object_get, "Warning: please link against libjson-c instead of libjson");
-
-/* __asm__(".section .gnu.warning." __STRING(sym) \
- " ; .ascii \"" msg "\" ; .text") */
diff --git a/src/components/json/linkhash.c b/src/components/json/linkhash.c
deleted file mode 100644
index 712c387..0000000
--- a/src/components/json/linkhash.c
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
- * $Id: linkhash.c,v 1.4 2006/01/26 02:16:28 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <limits.h>
-
-#ifdef HAVE_ENDIAN_H
-# include <endian.h> /* attempt to define endianness */
-#endif
-
-#include "random_seed.h"
-#include "linkhash.h"
-
-void lh_abort(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg);
- vprintf(msg, ap);
- va_end(ap);
- exit(1);
-}
-
-unsigned long lh_ptr_hash(const void *k)
-{
- /* CAW: refactored to be 64bit nice */
- return (unsigned long)((((ptrdiff_t)k * LH_PRIME) >> 4) & ULONG_MAX);
-}
-
-int lh_ptr_equal(const void *k1, const void *k2)
-{
- return (k1 == k2);
-}
-
-/*
- * hashlittle from lookup3.c, by Bob Jenkins, May 2006, Public Domain.
- * http://burtleburtle.net/bob/c/lookup3.c
- * minor modifications to make functions static so no symbols are exported
- * minor mofifications to compile with -Werror
- */
-
-/*
--------------------------------------------------------------------------------
-lookup3.c, by Bob Jenkins, May 2006, Public Domain.
-
-These are functions for producing 32-bit hashes for hash table lookup.
-hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
-are externally useful functions. Routines to test the hash are included
-if SELF_TEST is defined. You can use this free for any purpose. It's in
-the public domain. It has no warranty.
-
-You probably want to use hashlittle(). hashlittle() and hashbig()
-hash byte arrays. hashlittle() is is faster than hashbig() on
-little-endian machines. Intel and AMD are little-endian machines.
-On second thought, you probably want hashlittle2(), which is identical to
-hashlittle() except it returns two 32-bit hashes for the price of one.
-You could implement hashbig2() if you wanted but I haven't bothered here.
-
-If you want to find a hash of, say, exactly 7 integers, do
- a = i1; b = i2; c = i3;
- mix(a,b,c);
- a += i4; b += i5; c += i6;
- mix(a,b,c);
- a += i7;
- final(a,b,c);
-then use c as the hash value. If you have a variable length array of
-4-byte integers to hash, use hashword(). If you have a byte array (like
-a character string), use hashlittle(). If you have several byte arrays, or
-a mix of things, see the comments above hashlittle().
-
-Why is this so big? I read 12 bytes at a time into 3 4-byte integers,
-then mix those integers. This is fast (you can do a lot more thorough
-mixing with 12*3 instructions on 3 integers than you can with 3 instructions
-on 1 byte), but shoehorning those bytes into integers efficiently is messy.
--------------------------------------------------------------------------------
-*/
-
-/*
- * My best guess at if you are big-endian or little-endian. This may
- * need adjustment.
- */
-#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
- __BYTE_ORDER == __LITTLE_ENDIAN) || \
- (defined(i386) || defined(__i386__) || defined(__i486__) || \
- defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL))
-# define HASH_LITTLE_ENDIAN 1
-# define HASH_BIG_ENDIAN 0
-#elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
- __BYTE_ORDER == __BIG_ENDIAN) || \
- (defined(sparc) || defined(POWERPC) || defined(mc68000) || defined(sel))
-# define HASH_LITTLE_ENDIAN 0
-# define HASH_BIG_ENDIAN 1
-#else
-# define HASH_LITTLE_ENDIAN 0
-# define HASH_BIG_ENDIAN 0
-#endif
-
-#define hashsize(n) ((uint32_t)1<<(n))
-#define hashmask(n) (hashsize(n)-1)
-#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
-
-/*
--------------------------------------------------------------------------------
-mix -- mix 3 32-bit values reversibly.
-
-This is reversible, so any information in (a,b,c) before mix() is
-still in (a,b,c) after mix().
-
-If four pairs of (a,b,c) inputs are run through mix(), or through
-mix() in reverse, there are at least 32 bits of the output that
-are sometimes the same for one pair and different for another pair.
-This was tested for:
-* pairs that differed by one bit, by two bits, in any combination
- of top bits of (a,b,c), or in any combination of bottom bits of
- (a,b,c).
-* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed
- the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
- is commonly produced by subtraction) look like a single 1-bit
- difference.
-* the base values were pseudorandom, all zero but one bit set, or
- all zero plus a counter that starts at zero.
-
-Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that
-satisfy this are
- 4 6 8 16 19 4
- 9 15 3 18 27 15
- 14 9 3 7 17 3
-Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing
-for "differ" defined as + with a one-bit base and a two-bit delta. I
-used http://burtleburtle.net/bob/hash/avalanche.html to choose
-the operations, constants, and arrangements of the variables.
-
-This does not achieve avalanche. There are input bits of (a,b,c)
-that fail to affect some output bits of (a,b,c), especially of a. The
-most thoroughly mixed value is c, but it doesn't really even achieve
-avalanche in c.
-
-This allows some parallelism. Read-after-writes are good at doubling
-the number of bits affected, so the goal of mixing pulls in the opposite
-direction as the goal of parallelism. I did what I could. Rotates
-seem to cost as much as shifts on every machine I could lay my hands
-on, and rotates are much kinder to the top and bottom bits, so I used
-rotates.
--------------------------------------------------------------------------------
-*/
-#define mix(a,b,c) \
-{ \
- a -= c; a ^= rot(c, 4); c += b; \
- b -= a; b ^= rot(a, 6); a += c; \
- c -= b; c ^= rot(b, 8); b += a; \
- a -= c; a ^= rot(c,16); c += b; \
- b -= a; b ^= rot(a,19); a += c; \
- c -= b; c ^= rot(b, 4); b += a; \
-}
-
-/*
--------------------------------------------------------------------------------
-final -- final mixing of 3 32-bit values (a,b,c) into c
-
-Pairs of (a,b,c) values differing in only a few bits will usually
-produce values of c that look totally different. This was tested for
-* pairs that differed by one bit, by two bits, in any combination
- of top bits of (a,b,c), or in any combination of bottom bits of
- (a,b,c).
-* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed
- the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
- is commonly produced by subtraction) look like a single 1-bit
- difference.
-* the base values were pseudorandom, all zero but one bit set, or
- all zero plus a counter that starts at zero.
-
-These constants passed:
- 14 11 25 16 4 14 24
- 12 14 25 16 4 14 24
-and these came close:
- 4 8 15 26 3 22 24
- 10 8 15 26 3 22 24
- 11 8 15 26 3 22 24
--------------------------------------------------------------------------------
-*/
-#define final(a,b,c) \
-{ \
- c ^= b; c -= rot(b,14); \
- a ^= c; a -= rot(c,11); \
- b ^= a; b -= rot(a,25); \
- c ^= b; c -= rot(b,16); \
- a ^= c; a -= rot(c,4); \
- b ^= a; b -= rot(a,14); \
- c ^= b; c -= rot(b,24); \
-}
-
-
-/*
--------------------------------------------------------------------------------
-hashlittle() -- hash a variable-length key into a 32-bit value
- k : the key (the unaligned variable-length array of bytes)
- length : the length of the key, counting by bytes
- initval : can be any 4-byte value
-Returns a 32-bit value. Every bit of the key affects every bit of
-the return value. Two keys differing by one or two bits will have
-totally different hash values.
-
-The best hash table sizes are powers of 2. There is no need to do
-mod a prime (mod is sooo slow!). If you need less than 32 bits,
-use a bitmask. For example, if you need only 10 bits, do
- h = (h & hashmask(10));
-In which case, the hash table should have hashsize(10) elements.
-
-If you are hashing n strings (uint8_t **)k, do it like this:
- for (i=0, h=0; i<n; ++i) h = hashlittle( k[i], len[i], h);
-
-By Bob Jenkins, 2006. [email protected]. You may use this
-code any way you wish, private, educational, or commercial. It's free.
-
-Use for hash table lookup, or anything where one collision in 2^^32 is
-acceptable. Do NOT use for cryptographic purposes.
--------------------------------------------------------------------------------
-*/
-
-static uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
-{
- uint32_t a,b,c; /* internal state */
- union { const void *ptr; size_t i; } u; /* needed for Mac Powerbook G4 */
-
- /* Set up the internal state */
- a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
-
- u.ptr = key;
- if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
- const uint32_t *k = (const uint32_t *)key; /* read 32-bit chunks */
-
- /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
- while (length > 12)
- {
- a += k[0];
- b += k[1];
- c += k[2];
- mix(a,b,c);
- length -= 12;
- k += 3;
- }
-
- /*----------------------------- handle the last (probably partial) block */
- /*
- * "k[2]&0xffffff" actually reads beyond the end of the string, but
- * then masks off the part it's not allowed to read. Because the
- * string is aligned, the masked-off tail is in the same word as the
- * rest of the string. Every machine with memory protection I've seen
- * does it on word boundaries, so is OK with this. But VALGRIND will
- * still catch it and complain. The masking trick does make the hash
- * noticably faster for short strings (like English words).
- */
-#ifndef VALGRIND
-
- switch(length)
- {
- case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
- case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break;
- case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break;
- case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break;
- case 8 : b+=k[1]; a+=k[0]; break;
- case 7 : b+=k[1]&0xffffff; a+=k[0]; break;
- case 6 : b+=k[1]&0xffff; a+=k[0]; break;
- case 5 : b+=k[1]&0xff; a+=k[0]; break;
- case 4 : a+=k[0]; break;
- case 3 : a+=k[0]&0xffffff; break;
- case 2 : a+=k[0]&0xffff; break;
- case 1 : a+=k[0]&0xff; break;
- case 0 : return c; /* zero length strings require no mixing */
- }
-
-#else /* make valgrind happy */
-
- const uint8_t *k8 = (const uint8_t *)k;
- switch(length)
- {
- case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
- case 11: c+=((uint32_t)k8[10])<<16; /* fall through */
- case 10: c+=((uint32_t)k8[9])<<8; /* fall through */
- case 9 : c+=k8[8]; /* fall through */
- case 8 : b+=k[1]; a+=k[0]; break;
- case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */
- case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */
- case 5 : b+=k8[4]; /* fall through */
- case 4 : a+=k[0]; break;
- case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */
- case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */
- case 1 : a+=k8[0]; break;
- case 0 : return c;
- }
-
-#endif /* !valgrind */
-
- } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
- const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */
- const uint8_t *k8;
-
- /*--------------- all but last block: aligned reads and different mixing */
- while (length > 12)
- {
- a += k[0] + (((uint32_t)k[1])<<16);
- b += k[2] + (((uint32_t)k[3])<<16);
- c += k[4] + (((uint32_t)k[5])<<16);
- mix(a,b,c);
- length -= 12;
- k += 6;
- }
-
- /*----------------------------- handle the last (probably partial) block */
- k8 = (const uint8_t *)k;
- switch(length)
- {
- case 12: c+=k[4]+(((uint32_t)k[5])<<16);
- b+=k[2]+(((uint32_t)k[3])<<16);
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 11: c+=((uint32_t)k8[10])<<16; /* fall through */
- case 10: c+=k[4];
- b+=k[2]+(((uint32_t)k[3])<<16);
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 9 : c+=k8[8]; /* fall through */
- case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */
- case 6 : b+=k[2];
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 5 : b+=k8[4]; /* fall through */
- case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */
- case 2 : a+=k[0];
- break;
- case 1 : a+=k8[0];
- break;
- case 0 : return c; /* zero length requires no mixing */
- }
-
- } else { /* need to read the key one byte at a time */
- const uint8_t *k = (const uint8_t *)key;
-
- /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
- while (length > 12)
- {
- a += k[0];
- a += ((uint32_t)k[1])<<8;
- a += ((uint32_t)k[2])<<16;
- a += ((uint32_t)k[3])<<24;
- b += k[4];
- b += ((uint32_t)k[5])<<8;
- b += ((uint32_t)k[6])<<16;
- b += ((uint32_t)k[7])<<24;
- c += k[8];
- c += ((uint32_t)k[9])<<8;
- c += ((uint32_t)k[10])<<16;
- c += ((uint32_t)k[11])<<24;
- mix(a,b,c);
- length -= 12;
- k += 12;
- }
-
- /*-------------------------------- last block: affect all 32 bits of (c) */
- switch(length) /* all the case statements fall through */
- {
- case 12: c+=((uint32_t)k[11])<<24;
- case 11: c+=((uint32_t)k[10])<<16;
- case 10: c+=((uint32_t)k[9])<<8;
- case 9 : c+=k[8];
- case 8 : b+=((uint32_t)k[7])<<24;
- case 7 : b+=((uint32_t)k[6])<<16;
- case 6 : b+=((uint32_t)k[5])<<8;
- case 5 : b+=k[4];
- case 4 : a+=((uint32_t)k[3])<<24;
- case 3 : a+=((uint32_t)k[2])<<16;
- case 2 : a+=((uint32_t)k[1])<<8;
- case 1 : a+=k[0];
- break;
- case 0 : return c;
- }
- }
-
- final(a,b,c);
- return c;
-}
-
-unsigned long lh_char_hash(const void *k)
-{
- static volatile int random_seed = -1;
-
- if (random_seed == -1) {
- int seed;
- /* we can't use -1 as it is the unitialized sentinel */
- while ((seed = json_c_get_random_seed()) == -1);
-#if defined __GNUC__
- __sync_val_compare_and_swap(&random_seed, -1, seed);
-#elif defined _MSC_VER
- InterlockedCompareExchange(&random_seed, seed, -1);
-#else
-#warning "racy random seed initializtion if used by multiple threads"
- random_seed = seed; /* potentially racy */
-#endif
- }
-
- return hashlittle((const char*)k, strlen((const char*)k), random_seed);
-}
-
-int lh_char_equal(const void *k1, const void *k2)
-{
- return (strcmp((const char*)k1, (const char*)k2) == 0);
-}
-
-struct lh_table* lh_table_new(int size, const char *name,
- lh_entry_free_fn *free_fn,
- lh_hash_fn *hash_fn,
- lh_equal_fn *equal_fn)
-{
- int i;
- struct lh_table *t;
-
- t = (struct lh_table*)calloc(1, sizeof(struct lh_table));
- if(!t) lh_abort("lh_table_new: calloc failed\n");
- t->count = 0;
- t->size = size;
- t->name = name;
- t->table = (struct lh_entry*)calloc(size, sizeof(struct lh_entry));
- if(!t->table) lh_abort("lh_table_new: calloc failed\n");
- t->free_fn = free_fn;
- t->hash_fn = hash_fn;
- t->equal_fn = equal_fn;
- for(i = 0; i < size; i++) t->table[i].k = LH_EMPTY;
- return t;
-}
-
-struct lh_table* lh_kchar_table_new(int size, const char *name,
- lh_entry_free_fn *free_fn)
-{
- return lh_table_new(size, name, free_fn, lh_char_hash, lh_char_equal);
-}
-
-struct lh_table* lh_kptr_table_new(int size, const char *name,
- lh_entry_free_fn *free_fn)
-{
- return lh_table_new(size, name, free_fn, lh_ptr_hash, lh_ptr_equal);
-}
-
-void lh_table_resize(struct lh_table *t, int new_size)
-{
- struct lh_table *new_t;
- struct lh_entry *ent;
-
- new_t = lh_table_new(new_size, t->name, NULL, t->hash_fn, t->equal_fn);
- ent = t->head;
- while(ent) {
- lh_table_insert(new_t, ent->k, ent->v);
- ent = ent->next;
- }
- free(t->table);
- t->table = new_t->table;
- t->size = new_size;
- t->head = new_t->head;
- t->tail = new_t->tail;
- t->resizes++;
- free(new_t);
-}
-
-void lh_table_free(struct lh_table *t)
-{
- struct lh_entry *c;
- for(c = t->head; c != NULL; c = c->next) {
- if(t->free_fn) {
- t->free_fn(c);
- }
- }
- free(t->table);
- free(t);
-}
-
-
-int lh_table_insert(struct lh_table *t, void *k, const void *v)
-{
- unsigned long h, n;
-
- t->inserts++;
- if(t->count >= t->size * LH_LOAD_FACTOR) lh_table_resize(t, t->size * 2);
-
- h = t->hash_fn(k);
- n = h % t->size;
-
- while( 1 ) {
- if(t->table[n].k == LH_EMPTY || t->table[n].k == LH_FREED) break;
- t->collisions++;
- if ((int)++n == t->size) n = 0;
- }
-
- t->table[n].k = k;
- t->table[n].v = v;
- t->count++;
-
- if(t->head == NULL) {
- t->head = t->tail = &t->table[n];
- t->table[n].next = t->table[n].prev = NULL;
- } else {
- t->tail->next = &t->table[n];
- t->table[n].prev = t->tail;
- t->table[n].next = NULL;
- t->tail = &t->table[n];
- }
-
- return 0;
-}
-
-
-struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k)
-{
- unsigned long h = t->hash_fn(k);
- unsigned long n = h % t->size;
- int count = 0;
-
- t->lookups++;
- while( count < t->size ) {
- if(t->table[n].k == LH_EMPTY) return NULL;
- if(t->table[n].k != LH_FREED &&
- t->equal_fn(t->table[n].k, k)) return &t->table[n];
- if ((int)++n == t->size) n = 0;
- count++;
- }
- return NULL;
-}
-
-
-const void* lh_table_lookup(struct lh_table *t, const void *k)
-{
- void *result;
- lh_table_lookup_ex(t, k, &result);
- return result;
-}
-
-json_bool lh_table_lookup_ex(struct lh_table* t, const void* k, void **v)
-{
- struct lh_entry *e = lh_table_lookup_entry(t, k);
- if (e != NULL) {
- if (v != NULL) *v = (void *)e->v;
- return TRUE; /* key found */
- }
- if (v != NULL) *v = NULL;
- return FALSE; /* key not found */
-}
-
-int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e)
-{
- ptrdiff_t n = (ptrdiff_t)(e - t->table); /* CAW: fixed to be 64bit nice, still need the crazy negative case... */
-
- /* CAW: this is bad, really bad, maybe stack goes other direction on this machine... */
- if(n < 0) { return -2; }
-
- if(t->table[n].k == LH_EMPTY || t->table[n].k == LH_FREED) return -1;
- t->count--;
- if(t->free_fn) t->free_fn(e);
- t->table[n].v = NULL;
- t->table[n].k = LH_FREED;
- if(t->tail == &t->table[n] && t->head == &t->table[n]) {
- t->head = t->tail = NULL;
- } else if (t->head == &t->table[n]) {
- t->head->next->prev = NULL;
- t->head = t->head->next;
- } else if (t->tail == &t->table[n]) {
- t->tail->prev->next = NULL;
- t->tail = t->tail->prev;
- } else {
- t->table[n].prev->next = t->table[n].next;
- t->table[n].next->prev = t->table[n].prev;
- }
- t->table[n].next = t->table[n].prev = NULL;
- return 0;
-}
-
-
-int lh_table_delete(struct lh_table *t, const void *k)
-{
- struct lh_entry *e = lh_table_lookup_entry(t, k);
- if(!e) return -1;
- return lh_table_delete_entry(t, e);
-}
-
-int lh_table_length(struct lh_table *t)
-{
- return t->count;
-}
diff --git a/src/components/json/linkhash.h b/src/components/json/linkhash.h
deleted file mode 100644
index 950d09f..0000000
--- a/src/components/json/linkhash.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * $Id: linkhash.h,v 1.6 2006/01/30 23:07:57 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- * Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef _linkhash_h_
-#define _linkhash_h_
-
-#include "json_object.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * golden prime used in hash functions
- */
-#define LH_PRIME 0x9e370001UL
-
-/**
- * The fraction of filled hash buckets until an insert will cause the table
- * to be resized.
- * This can range from just above 0 up to 1.0.
- */
-#define LH_LOAD_FACTOR 0.66
-
-/**
- * sentinel pointer value for empty slots
- */
-#define LH_EMPTY (void*)-1
-
-/**
- * sentinel pointer value for freed slots
- */
-#define LH_FREED (void*)-2
-
-struct lh_entry;
-
-/**
- * callback function prototypes
- */
-typedef void (lh_entry_free_fn) (struct lh_entry *e);
-/**
- * callback function prototypes
- */
-typedef unsigned long (lh_hash_fn) (const void *k);
-/**
- * callback function prototypes
- */
-typedef int (lh_equal_fn) (const void *k1, const void *k2);
-
-/**
- * An entry in the hash table
- */
-struct lh_entry {
- /**
- * The key.
- */
- void *k;
- /**
- * The value.
- */
- const void *v;
- /**
- * The next entry
- */
- struct lh_entry *next;
- /**
- * The previous entry.
- */
- struct lh_entry *prev;
-};
-
-
-/**
- * The hash table structure.
- */
-struct lh_table {
- /**
- * Size of our hash.
- */
- int size;
- /**
- * Numbers of entries.
- */
- int count;
-
- /**
- * Number of collisions.
- */
- int collisions;
-
- /**
- * Number of resizes.
- */
- int resizes;
-
- /**
- * Number of lookups.
- */
- int lookups;
-
- /**
- * Number of inserts.
- */
- int inserts;
-
- /**
- * Number of deletes.
- */
- int deletes;
-
- /**
- * Name of the hash table.
- */
- const char *name;
-
- /**
- * The first entry.
- */
- struct lh_entry *head;
-
- /**
- * The last entry.
- */
- struct lh_entry *tail;
-
- struct lh_entry *table;
-
- /**
- * A pointer onto the function responsible for freeing an entry.
- */
- lh_entry_free_fn *free_fn;
- lh_hash_fn *hash_fn;
- lh_equal_fn *equal_fn;
-};
-
-
-/**
- * Pre-defined hash and equality functions
- */
-extern unsigned long lh_ptr_hash(const void *k);
-extern int lh_ptr_equal(const void *k1, const void *k2);
-
-extern unsigned long lh_char_hash(const void *k);
-extern int lh_char_equal(const void *k1, const void *k2);
-
-
-/**
- * Convenience list iterator.
- */
-#define lh_foreach(table, entry) \
-for(entry = table->head; entry; entry = entry->next)
-
-/**
- * lh_foreach_safe allows calling of deletion routine while iterating.
- */
-#define lh_foreach_safe(table, entry, tmp) \
-for(entry = table->head; entry && ((tmp = entry->next) || 1); entry = tmp)
-
-
-
-/**
- * Create a new linkhash table.
- * @param size initial table size. The table is automatically resized
- * although this incurs a performance penalty.
- * @param name the table name.
- * @param free_fn callback function used to free memory for entries
- * when lh_table_free or lh_table_delete is called.
- * If NULL is provided, then memory for keys and values
- * must be freed by the caller.
- * @param hash_fn function used to hash keys. 2 standard ones are defined:
- * lh_ptr_hash and lh_char_hash for hashing pointer values
- * and C strings respectively.
- * @param equal_fn comparison function to compare keys. 2 standard ones defined:
- * lh_ptr_hash and lh_char_hash for comparing pointer values
- * and C strings respectively.
- * @return a pointer onto the linkhash table.
- */
-extern struct lh_table* lh_table_new(int size, const char *name,
- lh_entry_free_fn *free_fn,
- lh_hash_fn *hash_fn,
- lh_equal_fn *equal_fn);
-
-/**
- * Convenience function to create a new linkhash
- * table with char keys.
- * @param size initial table size.
- * @param name table name.
- * @param free_fn callback function used to free memory for entries.
- * @return a pointer onto the linkhash table.
- */
-extern struct lh_table* lh_kchar_table_new(int size, const char *name,
- lh_entry_free_fn *free_fn);
-
-
-/**
- * Convenience function to create a new linkhash
- * table with ptr keys.
- * @param size initial table size.
- * @param name table name.
- * @param free_fn callback function used to free memory for entries.
- * @return a pointer onto the linkhash table.
- */
-extern struct lh_table* lh_kptr_table_new(int size, const char *name,
- lh_entry_free_fn *free_fn);
-
-
-/**
- * Free a linkhash table.
- * If a callback free function is provided then it is called for all
- * entries in the table.
- * @param t table to free.
- */
-extern void lh_table_free(struct lh_table *t);
-
-
-/**
- * Insert a record into the table.
- * @param t the table to insert into.
- * @param k a pointer to the key to insert.
- * @param v a pointer to the value to insert.
- */
-extern int lh_table_insert(struct lh_table *t, void *k, const void *v);
-
-
-/**
- * Lookup a record into the table.
- * @param t the table to lookup
- * @param k a pointer to the key to lookup
- * @return a pointer to the record structure of the value or NULL if it does not exist.
- */
-extern struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k);
-
-/**
- * Lookup a record into the table
- * @param t the table to lookup
- * @param k a pointer to the key to lookup
- * @return a pointer to the found value or NULL if it does not exist.
- * @deprecated Use lh_table_lookup_ex instead.
- */
-THIS_FUNCTION_IS_DEPRECATED(extern const void* lh_table_lookup(struct lh_table *t, const void *k));
-
-/**
- * Lookup a record in the table
- * @param t the table to lookup
- * @param k a pointer to the key to lookup
- * @param v a pointer to a where to store the found value (set to NULL if it doesn't exist).
- * @return whether or not the key was found
- */
-extern json_bool lh_table_lookup_ex(struct lh_table *t, const void *k, void **v);
-
-/**
- * Delete a record from the table.
- * If a callback free function is provided then it is called for the
- * for the item being deleted.
- * @param t the table to delete from.
- * @param e a pointer to the entry to delete.
- * @return 0 if the item was deleted.
- * @return -1 if it was not found.
- */
-extern int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e);
-
-
-/**
- * Delete a record from the table.
- * If a callback free function is provided then it is called for the
- * for the item being deleted.
- * @param t the table to delete from.
- * @param k a pointer to the key to delete.
- * @return 0 if the item was deleted.
- * @return -1 if it was not found.
- */
-extern int lh_table_delete(struct lh_table *t, const void *k);
-
-extern int lh_table_length(struct lh_table *t);
-
-void lh_abort(const char *msg, ...);
-void lh_table_resize(struct lh_table *t, int new_size);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/json/math_compat.h b/src/components/json/math_compat.h
deleted file mode 100644
index f40b8fa..0000000
--- a/src/components/json/math_compat.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __math_compat_h
-#define __math_compat_h
-
-/* Define isnan and isinf on Windows/MSVC */
-
-#ifndef HAVE_DECL_ISNAN
-# ifdef HAVE_DECL__ISNAN
-#include <float.h>
-#define isnan(x) _isnan(x)
-# endif
-#endif
-
-#ifndef HAVE_DECL_ISINF
-# ifdef HAVE_DECL__FINITE
-#include <float.h>
-#define isinf(x) (!_finite(x))
-# endif
-#endif
-
-#ifndef HAVE_DECL_NAN
-#error This platform does not have nan()
-#endif
-
-#ifndef HAVE_DECL_INFINITY
-#error This platform does not have INFINITY
-#endif
-
-#endif
diff --git a/src/components/json/parse_flags.c b/src/components/json/parse_flags.c
deleted file mode 100644
index 1af61ea..0000000
--- a/src/components/json/parse_flags.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "config.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#include "json.h"
-#include "parse_flags.h"
-
-#if !defined(HAVE_STRCASECMP) && defined(_MSC_VER)
-# define strcasecmp _stricmp
-#elif !defined(HAVE_STRCASECMP)
-# error You do not have strcasecmp on your system.
-#endif /* HAVE_STRNCASECMP */
-
-static struct {
- const char *arg;
- int flag;
-} format_args[] = {
- { "plain", JSON_C_TO_STRING_PLAIN },
- { "spaced", JSON_C_TO_STRING_SPACED },
- { "pretty", JSON_C_TO_STRING_PRETTY },
-};
-
-#ifndef NELEM
-#define NELEM(x) (sizeof(x) / sizeof(&x[0]))
-#endif
-
-int parse_flags(int argc, char **argv)
-{
- int arg_idx;
- int sflags = 0;
- for (arg_idx = 1; arg_idx < argc ; arg_idx++)
- {
- int jj;
- for (jj = 0; jj < (int)NELEM(format_args); jj++)
- {
- if (strcasecmp(argv[arg_idx], format_args[jj].arg) == 0)
- {
- sflags |= format_args[jj].flag;
- break;
- }
- }
- if (jj == NELEM(format_args))
- {
- printf("Unknown arg: %s\n", argv[arg_idx]);
- exit(1);
- }
- }
- return sflags;
-}
diff --git a/src/components/json/parse_flags.h b/src/components/json/parse_flags.h
deleted file mode 100644
index c5e2f41..0000000
--- a/src/components/json/parse_flags.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef __parse_flags_h
-#define __parse_flags_h
-int parse_flags(int argc, char **argv);
-#endif
diff --git a/src/components/json/printbuf.c b/src/components/json/printbuf.c
deleted file mode 100644
index fcef381..0000000
--- a/src/components/json/printbuf.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * $Id: printbuf.c,v 1.5 2006/01/26 02:16:28 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- *
- * Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved.
- * The copyrights to the contents of this file are licensed under the MIT License
- * (http://www.opensource.org/licenses/mit-license.php)
- */
-
-#include "config.h"
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef HAVE_STDARG_H
-# include <stdarg.h>
-#else /* !HAVE_STDARG_H */
-# error Not enough var arg support!
-#endif /* HAVE_STDARG_H */
-
-#include "bits.h"
-#include "debug.h"
-#include "printbuf.h"
-
-static int printbuf_extend(struct printbuf *p, int min_size);
-
-struct printbuf* printbuf_new(void)
-{
- struct printbuf *p;
-
- p = (struct printbuf*)calloc(1, sizeof(struct printbuf));
- if(!p) return NULL;
- p->size = 32;
- p->bpos = 0;
- if(!(p->buf = (char*)malloc(p->size))) {
- free(p);
- return NULL;
- }
- return p;
-}
-
-
-/**
- * Extend the buffer p so it has a size of at least min_size.
- *
- * If the current size is large enough, nothing is changed.
- *
- * Note: this does not check the available space! The caller
- * is responsible for performing those calculations.
- */
-static int printbuf_extend(struct printbuf *p, int min_size)
-{
- char *t;
- int new_size;
-
- if (p->size >= min_size)
- return 0;
-
- new_size = json_max(p->size * 2, min_size + 8);
-#ifdef PRINTBUF_DEBUG
- MC_DEBUG("printbuf_memappend: realloc "
- "bpos=%d min_size=%d old_size=%d new_size=%d\n",
- p->bpos, min_size, p->size, new_size);
-#endif /* PRINTBUF_DEBUG */
- if(!(t = (char*)realloc(p->buf, new_size)))
- return -1;
- p->size = new_size;
- p->buf = t;
- return 0;
-}
-
-int printbuf_memappend(struct printbuf *p, const char *buf, int size)
-{
- if (p->size <= p->bpos + size + 1) {
- if (printbuf_extend(p, p->bpos + size + 1) < 0)
- return -1;
- }
- memcpy(p->buf + p->bpos, buf, size);
- p->bpos += size;
- p->buf[p->bpos]= '\0';
- return size;
-}
-
-int printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len)
-{
- int size_needed;
-
- if (offset == -1)
- offset = pb->bpos;
- size_needed = offset + len;
- if (pb->size < size_needed)
- {
- if (printbuf_extend(pb, size_needed) < 0)
- return -1;
- }
-
- memset(pb->buf + offset, charvalue, len);
- if (pb->bpos < size_needed)
- pb->bpos = size_needed;
-
- return 0;
-}
-
-#if !defined(HAVE_VSNPRINTF) && defined(_MSC_VER)
-# define vsnprintf _vsnprintf
-#elif !defined(HAVE_VSNPRINTF) /* !HAVE_VSNPRINTF */
-# error Need vsnprintf!
-#endif /* !HAVE_VSNPRINTF && defined(WIN32) */
-
-#if !defined(HAVE_VASPRINTF)
-/* CAW: compliant version of vasprintf */
-static int vasprintf(char **buf, const char *fmt, va_list ap)
-{
-#ifndef WIN32
- static char _T_emptybuffer = '\0';
-#endif /* !defined(WIN32) */
- int chars;
- char *b;
-
- if(!buf) { return -1; }
-
-#ifdef WIN32
- chars = _vscprintf(fmt, ap)+1;
-#else /* !defined(WIN32) */
- /* CAW: RAWR! We have to hope to god here that vsnprintf doesn't overwrite
- our buffer like on some 64bit sun systems.... but hey, its time to move on */
- chars = vsnprintf(&_T_emptybuffer, 0, fmt, ap)+1;
- if(chars < 0) { chars *= -1; } /* CAW: old glibc versions have this problem */
-#endif /* defined(WIN32) */
-
- b = (char*)malloc(sizeof(char)*chars);
- if(!b) { return -1; }
-
- if((chars = vsprintf(b, fmt, ap)) < 0)
- {
- free(b);
- } else {
- *buf = b;
- }
-
- return chars;
-}
-#endif /* !HAVE_VASPRINTF */
-
-int sprintbuf(struct printbuf *p, const char *msg, ...)
-{
- va_list ap;
- char *t;
- int size;
- char buf[128];
-
- /* user stack buffer first */
- va_start(ap, msg);
- size = vsnprintf(buf, 128, msg, ap);
- va_end(ap);
- /* if string is greater than stack buffer, then use dynamic string
- with vasprintf. Note: some implementation of vsnprintf return -1
- if output is truncated whereas some return the number of bytes that
- would have been written - this code handles both cases. */
- if(size == -1 || size > 127) {
- va_start(ap, msg);
- if((size = vasprintf(&t, msg, ap)) < 0) { va_end(ap); return -1; }
- va_end(ap);
- printbuf_memappend(p, t, size);
- free(t);
- return size;
- } else {
- printbuf_memappend(p, buf, size);
- return size;
- }
-}
-
-void printbuf_reset(struct printbuf *p)
-{
- p->buf[0] = '\0';
- p->bpos = 0;
-}
-
-void printbuf_free(struct printbuf *p)
-{
- if(p) {
- free(p->buf);
- free(p);
- }
-}
diff --git a/src/components/json/printbuf.h b/src/components/json/printbuf.h
deleted file mode 100644
index b1bde7f..0000000
--- a/src/components/json/printbuf.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id: printbuf.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- *
- * Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved.
- * The copyrights to the contents of this file are licensed under the MIT License
- * (http://www.opensource.org/licenses/mit-license.php)
- */
-
-#ifndef _printbuf_h_
-#define _printbuf_h_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct printbuf {
- char *buf;
- int bpos;
- int size;
-};
-
-extern struct printbuf*
-printbuf_new(void);
-
-/* As an optimization, printbuf_memappend_fast is defined as a macro
- * that handles copying data if the buffer is large enough; otherwise
- * it invokes printbuf_memappend_real() which performs the heavy
- * lifting of realloc()ing the buffer and copying data.
- * Your code should not use printbuf_memappend directly--use
- * printbuf_memappend_fast instead.
- */
-extern int
-printbuf_memappend(struct printbuf *p, const char *buf, int size);
-
-#define printbuf_memappend_fast(p, bufptr, bufsize) \
-do { \
- if ((p->size - p->bpos) > bufsize) { \
- memcpy(p->buf + p->bpos, (bufptr), bufsize); \
- p->bpos += bufsize; \
- p->buf[p->bpos]= '\0'; \
- } else { printbuf_memappend(p, (bufptr), bufsize); } \
-} while (0)
-
-#define printbuf_length(p) ((p)->bpos)
-
-/**
- * Set len bytes of the buffer to charvalue, starting at offset offset.
- * Similar to calling memset(x, charvalue, len);
- *
- * The memory allocated for the buffer is extended as necessary.
- *
- * If offset is -1, this starts at the end of the current data in the buffer.
- */
-extern int
-printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len);
-
-extern int
-sprintbuf(struct printbuf *p, const char *msg, ...);
-
-extern void
-printbuf_reset(struct printbuf *p);
-
-extern void
-printbuf_free(struct printbuf *p);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/json/random_seed.c b/src/components/json/random_seed.c
deleted file mode 100644
index 3b520d4..0000000
--- a/src/components/json/random_seed.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * random_seed.c
- *
- * Copyright (c) 2013 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#include <stdio.h>
-#include "config.h"
-
-#define DEBUG_SEED(s)
-
-
-#if defined ENABLE_RDRAND
-
-/* cpuid */
-
-#if defined __GNUC__ && (defined __i386__ || defined __x86_64__)
-#define HAS_X86_CPUID 1
-
-static void do_cpuid(int regs[], int h)
-{
- __asm__ __volatile__(
-#if defined __x86_64__
- "pushq %%rbx;\n"
-#else
- "pushl %%ebx;\n"
-#endif
- "cpuid;\n"
-#if defined __x86_64__
- "popq %%rbx;\n"
-#else
- "popl %%ebx;\n"
-#endif
- : "=a"(regs[0]), [ebx] "=r"(regs[1]), "=c"(regs[2]), "=d"(regs[3])
- : "a"(h));
-}
-
-#elif defined _MSC_VER
-
-#define HAS_X86_CPUID 1
-#define do_cpuid __cpuid
-
-#endif
-
-/* has_rdrand */
-
-#if HAS_X86_CPUID
-
-static int has_rdrand()
-{
- // CPUID.01H:ECX.RDRAND[bit 30] == 1
- int regs[4];
- do_cpuid(regs, 1);
- return (regs[2] & (1 << 30)) != 0;
-}
-
-#endif
-
-/* get_rdrand_seed - GCC x86 and X64 */
-
-#if defined __GNUC__ && (defined __i386__ || defined __x86_64__)
-
-#define HAVE_RDRAND 1
-
-static int get_rdrand_seed()
-{
- DEBUG_SEED("get_rdrand_seed");
- int _eax;
- // rdrand eax
- __asm__ __volatile__("1: .byte 0x0F\n"
- " .byte 0xC7\n"
- " .byte 0xF0\n"
- " jnc 1b;\n"
- : "=a" (_eax));
- return _eax;
-}
-
-#endif
-
-#if defined _MSC_VER
-
-#if _MSC_VER >= 1700
-#define HAVE_RDRAND 1
-
-/* get_rdrand_seed - Visual Studio 2012 and above */
-
-static int get_rdrand_seed()
-{
- DEBUG_SEED("get_rdrand_seed");
- int r;
- while (_rdrand32_step(&r) == 0);
- return r;
-}
-
-#elif defined _M_IX86
-#define HAVE_RDRAND 1
-
-/* get_rdrand_seed - Visual Studio 2010 and below - x86 only */
-
-static int get_rdrand_seed()
-{
- DEBUG_SEED("get_rdrand_seed");
- int _eax;
-retry:
- // rdrand eax
- __asm _emit 0x0F __asm _emit 0xC7 __asm _emit 0xF0
- __asm jnc retry
- __asm mov _eax, eax
- return _eax;
-}
-
-#endif
-#endif
-
-#endif /* defined ENABLE_RDRAND */
-
-
-/* has_dev_urandom */
-
-#if defined (__APPLE__) || defined(__unix__) || defined(__linux__)
-
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-
-#define HAVE_DEV_RANDOM 1
-
-static const char *dev_random_file = "/dev/urandom";
-
-static int has_dev_urandom()
-{
- struct stat buf;
- if (stat(dev_random_file, &buf)) {
- return 0;
- }
- return ((buf.st_mode & S_IFCHR) != 0);
-}
-
-
-/* get_dev_random_seed */
-
-static int get_dev_random_seed()
-{
- DEBUG_SEED("get_dev_random_seed");
-
- int fd = open(dev_random_file, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, "error opening %s: %s", dev_random_file, strerror(errno));
- exit(1);
- }
-
- int r;
- ssize_t nread = read(fd, &r, sizeof(r));
- if (nread != sizeof(r)) {
- fprintf(stderr, "error read %s: %s", dev_random_file, strerror(errno));
- exit(1);
- }
- else if (nread != sizeof(r)) {
- fprintf(stderr, "error short read %s", dev_random_file);
- exit(1);
- }
- close(fd);
- return r;
-}
-
-#endif
-
-
-/* get_cryptgenrandom_seed */
-
-#ifdef WIN32
-
-#define HAVE_CRYPTGENRANDOM 1
-
-#include <windows.h>
-#pragma comment(lib, "advapi32.lib")
-
-static int get_cryptgenrandom_seed()
-{
- DEBUG_SEED("get_cryptgenrandom_seed");
-
- HCRYPTPROV hProvider = 0;
- int r;
-
- if (!CryptAcquireContextW(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
- fprintf(stderr, "error CryptAcquireContextW");
- exit(1);
- }
-
- if (!CryptGenRandom(hProvider, sizeof(r), (BYTE*)&r)) {
- fprintf(stderr, "error CryptGenRandom");
- exit(1);
- }
-
- CryptReleaseContext(hProvider, 0);
-
- return r;
-}
-
-#endif
-
-
-/* get_time_seed */
-
-#include <time.h>
-
-static int get_time_seed()
-{
- DEBUG_SEED("get_time_seed");
-
- return (int)time(NULL) * 433494437;
-}
-
-
-/* json_c_get_random_seed */
-
-int json_c_get_random_seed()
-{
-#if HAVE_RDRAND
- if (has_rdrand()) return get_rdrand_seed();
-#endif
-#if HAVE_DEV_RANDOM
- if (has_dev_urandom()) return get_dev_random_seed();
-#endif
-#if HAVE_CRYPTGENRANDOM
- return get_cryptgenrandom_seed();
-#endif
- return get_time_seed();
-}
diff --git a/src/components/json/random_seed.h b/src/components/json/random_seed.h
deleted file mode 100644
index 7362d67..0000000
--- a/src/components/json/random_seed.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * random_seed.h
- *
- * Copyright (c) 2013 Metaparadigm Pte. Ltd.
- * Michael Clark <[email protected]>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
-#ifndef seed_h
-#define seed_h
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern int json_c_get_random_seed();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/redis/async.h b/src/components/redis/async.h
deleted file mode 100644
index e69d840..0000000
--- a/src/components/redis/async.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>
- * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Redis nor the names of its contributors may be used
- * to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __HIREDIS_ASYNC_H
-#define __HIREDIS_ASYNC_H
-#include "hiredis.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct redisAsyncContext; /* need forward declaration of redisAsyncContext */
-struct dict; /* dictionary header is included in async.c */
-
-/* Reply callback prototype and container */
-typedef void (redisCallbackFn)(struct redisAsyncContext*, void*, void*);
-typedef struct redisCallback {
- struct redisCallback *next; /* simple singly linked list */
- redisCallbackFn *fn;
- int pending_subs;
- void *privdata;
-} redisCallback;
-
-/* List of callbacks for either regular replies or pub/sub */
-typedef struct redisCallbackList {
- redisCallback *head, *tail;
-} redisCallbackList;
-
-/* Connection callback prototypes */
-typedef void (redisDisconnectCallback)(const struct redisAsyncContext*, int status);
-typedef void (redisConnectCallback)(const struct redisAsyncContext*, int status);
-
-/* Context for an async connection to Redis */
-typedef struct redisAsyncContext {
- /* Hold the regular context, so it can be realloc'ed. */
- redisContext c;
-
- /* Setup error flags so they can be used directly. */
- int err;
- char *errstr;
-
- /* Not used by hiredis */
- void *data;
-
- /* Event library data and hooks */
- struct {
- void *data;
-
- /* Hooks that are called when the library expects to start
- * reading/writing. These functions should be idempotent. */
- void (*addRead)(void *privdata);
- void (*delRead)(void *privdata);
- void (*addWrite)(void *privdata);
- void (*delWrite)(void *privdata);
- void (*cleanup)(void *privdata);
- } ev;
-
- /* Called when either the connection is terminated due to an error or per
- * user request. The status is set accordingly (REDIS_OK, REDIS_ERR). */
- redisDisconnectCallback *onDisconnect;
-
- /* Called when the first write event was received. */
- redisConnectCallback *onConnect;
-
- /* Regular command callbacks */
- redisCallbackList replies;
-
- /* Subscription callbacks */
- struct {
- redisCallbackList invalid;
- struct dict *channels;
- struct dict *patterns;
- } sub;
-} redisAsyncContext;
-
-/* Functions that proxy to hiredis */
-redisAsyncContext *redisAsyncConnect(const char *ip, int port);
-redisAsyncContext *redisAsyncConnectBind(const char *ip, int port, const char *source_addr);
-redisAsyncContext *redisAsyncConnectBindWithReuse(const char *ip, int port,
- const char *source_addr);
-redisAsyncContext *redisAsyncConnectUnix(const char *path);
-int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn);
-int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn);
-void redisAsyncDisconnect(redisAsyncContext *ac);
-void redisAsyncFree(redisAsyncContext *ac);
-
-/* Handle read/write events */
-void redisAsyncHandleRead(redisAsyncContext *ac);
-void redisAsyncHandleWrite(redisAsyncContext *ac);
-
-/* Command functions for an async context. Write the command to the
- * output buffer and register the provided callback. */
-int redisvAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, va_list ap);
-int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, ...);
-int redisAsyncCommandArgv(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen);
-int redisAsyncFormattedCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *cmd, size_t len);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/redis/hiredis.h b/src/components/redis/hiredis.h
deleted file mode 100644
index a743760..0000000
--- a/src/components/redis/hiredis.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>
- * Copyright (c) 2010-2014, Pieter Noordhuis <pcnoordhuis at gmail dot com>
- * Copyright (c) 2015, Matt Stancliff <matt at genges dot com>,
- * Jan-Erik Rediger <janerik at fnordig dot com>
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Redis nor the names of its contributors may be used
- * to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __HIREDIS_H
-#define __HIREDIS_H
-#include "read.h"
-#include <stdarg.h> /* for va_list */
-#include <sys/time.h> /* for struct timeval */
-#include <stdint.h> /* uintXX_t, etc */
-#include "sds.h" /* for sds */
-
-#define HIREDIS_MAJOR 0
-#define HIREDIS_MINOR 13
-#define HIREDIS_PATCH 3
-#define HIREDIS_SONAME 0.13
-
-/* Connection type can be blocking or non-blocking and is set in the
- * least significant bit of the flags field in redisContext. */
-#define REDIS_BLOCK 0x1
-
-/* Connection may be disconnected before being free'd. The second bit
- * in the flags field is set when the context is connected. */
-#define REDIS_CONNECTED 0x2
-
-/* The async API might try to disconnect cleanly and flush the output
- * buffer and read all subsequent replies before disconnecting.
- * This flag means no new commands can come in and the connection
- * should be terminated once all replies have been read. */
-#define REDIS_DISCONNECTING 0x4
-
-/* Flag specific to the async API which means that the context should be clean
- * up as soon as possible. */
-#define REDIS_FREEING 0x8
-
-/* Flag that is set when an async callback is executed. */
-#define REDIS_IN_CALLBACK 0x10
-
-/* Flag that is set when the async context has one or more subscriptions. */
-#define REDIS_SUBSCRIBED 0x20
-
-/* Flag that is set when monitor mode is active */
-#define REDIS_MONITORING 0x40
-
-/* Flag that is set when we should set SO_REUSEADDR before calling bind() */
-#define REDIS_REUSEADDR 0x80
-
-#define REDIS_KEEPALIVE_INTERVAL 15 /* seconds */
-
-/* number of times we retry to connect in the case of EADDRNOTAVAIL and
- * SO_REUSEADDR is being used. */
-#define REDIS_CONNECT_RETRIES 10
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* This is the reply object returned by redisCommand() */
-typedef struct redisReply {
- int type; /* REDIS_REPLY_* */
- long long integer; /* The integer when type is REDIS_REPLY_INTEGER */
- size_t len; /* Length of string */
- char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */
- size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */
- struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */
-} redisReply;
-
-redisReader *redisReaderCreate(void);
-
-/* Function to free the reply objects hiredis returns by default. */
-void freeReplyObject(void *reply);
-
-/* Functions to format a command according to the protocol. */
-int redisvFormatCommand(char **target, const char *format, va_list ap);
-int redisFormatCommand(char **target, const char *format, ...);
-int redisFormatCommandArgv(char **target, int argc, const char **argv, const size_t *argvlen);
-int redisFormatSdsCommandArgv(sds *target, int argc, const char ** argv, const size_t *argvlen);
-void redisFreeCommand(char *cmd);
-void redisFreeSdsCommand(sds cmd);
-
-enum redisConnectionType {
- REDIS_CONN_TCP,
- REDIS_CONN_UNIX
-};
-
-/* Context for a connection to Redis */
-typedef struct redisContext {
- int err; /* Error flags, 0 when there is no error */
- char errstr[128]; /* String representation of error when applicable */
- int fd;
- int flags;
- char *obuf; /* Write buffer */
- redisReader *reader; /* Protocol reader */
-
- enum redisConnectionType connection_type;
- struct timeval *timeout;
-
- struct {
- char *host;
- char *source_addr;
- int port;
- } tcp;
-
- struct {
- char *path;
- } unix_sock;
-
-} redisContext;
-
-redisContext *redisConnect(const char *ip, int port);
-redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv);
-redisContext *redisConnectNonBlock(const char *ip, int port);
-redisContext *redisConnectBindNonBlock(const char *ip, int port,
- const char *source_addr);
-redisContext *redisConnectBindNonBlockWithReuse(const char *ip, int port,
- const char *source_addr);
-redisContext *redisConnectUnix(const char *path);
-redisContext *redisConnectUnixWithTimeout(const char *path, const struct timeval tv);
-redisContext *redisConnectUnixNonBlock(const char *path);
-redisContext *redisConnectFd(int fd);
-
-/**
- * Reconnect the given context using the saved information.
- *
- * This re-uses the exact same connect options as in the initial connection.
- * host, ip (or path), timeout and bind address are reused,
- * flags are used unmodified from the existing context.
- *
- * Returns REDIS_OK on successful connect or REDIS_ERR otherwise.
- */
-int redisReconnect(redisContext *c);
-
-int redisSetTimeout(redisContext *c, const struct timeval tv);
-int redisEnableKeepAlive(redisContext *c);
-void redisFree(redisContext *c);
-int redisFreeKeepFd(redisContext *c);
-int redisBufferRead(redisContext *c);
-int redisBufferWrite(redisContext *c, int *done);
-
-/* In a blocking context, this function first checks if there are unconsumed
- * replies to return and returns one if so. Otherwise, it flushes the output
- * buffer to the socket and reads until it has a reply. In a non-blocking
- * context, it will return unconsumed replies until there are no more. */
-int redisGetReply(redisContext *c, void **reply);
-int redisGetReplyFromReader(redisContext *c, void **reply);
-
-/* Write a formatted command to the output buffer. Use these functions in blocking mode
- * to get a pipeline of commands. */
-int redisAppendFormattedCommand(redisContext *c, const char *cmd, size_t len);
-
-/* Write a command to the output buffer. Use these functions in blocking mode
- * to get a pipeline of commands. */
-int redisvAppendCommand(redisContext *c, const char *format, va_list ap);
-int redisAppendCommand(redisContext *c, const char *format, ...);
-int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
-
-/* Issue a command to Redis. In a blocking context, it is identical to calling
- * redisAppendCommand, followed by redisGetReply. The function will return
- * NULL if there was an error in performing the request, otherwise it will
- * return the reply. In a non-blocking context, it is identical to calling
- * only redisAppendCommand and will always return NULL. */
-void *redisvCommand(redisContext *c, const char *format, va_list ap);
-void *redisCommand(redisContext *c, const char *format, ...);
-void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/redis/libevent.h b/src/components/redis/libevent.h
deleted file mode 100644
index 69e9533..0000000
--- a/src/components/redis/libevent.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Redis nor the names of its contributors may be used
- * to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __HIREDIS_LIBEVENT_H__
-#define __HIREDIS_LIBEVENT_H__
-#include <event.h>
-#include "hiredis.h"
-#include "async.h"
-
-typedef struct redisLibeventEvents {
- redisAsyncContext *context;
- struct event *rev, *wev;
-} redisLibeventEvents;
-
-static void redisLibeventReadEvent(int fd, short event, void *arg) {
- ((void)fd); ((void)event);
- redisLibeventEvents *e = (redisLibeventEvents*)arg;
- redisAsyncHandleRead(e->context);
-}
-
-static void redisLibeventWriteEvent(int fd, short event, void *arg) {
- ((void)fd); ((void)event);
- redisLibeventEvents *e = (redisLibeventEvents*)arg;
- redisAsyncHandleWrite(e->context);
-}
-
-static void redisLibeventAddRead(void *privdata) {
- redisLibeventEvents *e = (redisLibeventEvents*)privdata;
- event_add(e->rev,NULL);
-}
-
-static void redisLibeventDelRead(void *privdata) {
- redisLibeventEvents *e = (redisLibeventEvents*)privdata;
- event_del(e->rev);
-}
-
-static void redisLibeventAddWrite(void *privdata) {
- redisLibeventEvents *e = (redisLibeventEvents*)privdata;
- event_add(e->wev,NULL);
-}
-
-static void redisLibeventDelWrite(void *privdata) {
- redisLibeventEvents *e = (redisLibeventEvents*)privdata;
- event_del(e->wev);
-}
-
-static void redisLibeventCleanup(void *privdata) {
- redisLibeventEvents *e = (redisLibeventEvents*)privdata;
- event_free(e->rev);
- event_free(e->wev);
- free(e);
-}
-
-static int redisLibeventAttach(redisAsyncContext *ac, struct event_base *base) {
- redisContext *c = &(ac->c);
- redisLibeventEvents *e;
-
- /* Nothing should be attached when something is already attached */
- if (ac->ev.data != NULL)
- return REDIS_ERR;
-
- /* Create container for context and r/w events */
- e = (redisLibeventEvents*)malloc(sizeof(*e));
- e->context = ac;
-
- /* Register functions to start/stop listening for events */
- ac->ev.addRead = redisLibeventAddRead;
- ac->ev.delRead = redisLibeventDelRead;
- ac->ev.addWrite = redisLibeventAddWrite;
- ac->ev.delWrite = redisLibeventDelWrite;
- ac->ev.cleanup = redisLibeventCleanup;
- ac->ev.data = e;
-
- /* Initialize and install read/write events */
- e->rev = event_new(base, c->fd, EV_READ, redisLibeventReadEvent, e);
- e->wev = event_new(base, c->fd, EV_WRITE, redisLibeventWriteEvent, e);
- event_add(e->rev, NULL);
- event_add(e->wev, NULL);
- return REDIS_OK;
-}
-#endif
diff --git a/src/components/redis/rd_lock.c b/src/components/redis/rd_lock.c
deleted file mode 100644
index 6b44c6a..0000000
--- a/src/components/redis/rd_lock.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*************************************************************************
- > File Name: rd_lock.c
- > Author:
- > Mail:
- > Created Time: 2018��07��05�� ������ 11ʱ01��39��
- ************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <time.h>
-#include <math.h>
-
-#include "rd_lock.h"
-#include "rt_string.h"
-
-struct rd_RedLock{
- float m_clockDriftFactor;
- sds m_unlockScript;
- int m_retryCount;
- int m_retryDelay;
-};
-
-static struct rd_RedLock redlock = {
- .m_clockDriftFactor = 0.01,
- .m_unlockScript = NULL,
- .m_retryCount = 0,
- .m_retryDelay = 0,
-};
-
-struct rd_RedLock *mutx_redlock()
-{
- return &redlock;
-}
-
-static char *
-get_unique_lockid()
-{
- int i = 0;
- char *s = NULL;
- char value[10] = "abcdefghij";
- unsigned char buffer[20];
-
- struct timeval t1;
- gettimeofday(&t1, NULL);
- srand(t1.tv_usec * t1.tv_sec);
-
- for (int i = 0; i < 20; ++i) {
- buffer[i] = value[rand() % 10];
- }
- //��ȡ20byte���������
- s = sdsempty();
- for (i = 0; i < 20; i++) {
- s = sdscatprintf(s, "%02X", buffer[i]);
- }
-
- return s;
-}
-
-static int
-rd_lock_instance(redisContext *c, const char *key,
- const char *val, const int ttl)
-{
- int xret = 0;
- redisReply *reply;
-
- reply = (redisReply *)redisCommand(c, "set %s %s px %d nx", key, val, ttl);
- if (NULL == reply)
- goto finish;
-
- if (reply->str && STRCMP(reply->str, "OK") == 0) {
- xret = 1;
- }
- freeReplyObject(reply);
-
-finish:
- return xret;
-}
-
-static char **convertToSds(int count, char** args)
-{
- int j;
- char **sds = (char**)malloc(sizeof(char*)*count);
- for(j = 0; j < count; j++)
- sds[j] = sdsnew(args[j]);
- return sds;
-}
-
-redisReply *rd_command_argv(redisContext *c, int argc, char **inargv)
-{
- redisReply *reply = NULL;
-
- char **argv;
- argv = convertToSds(argc, inargv);
-
- size_t *argvlen;
- argvlen = (size_t *)malloc(argc * sizeof(size_t));
-
- for (int j = 0; j < argc; j++)
- argvlen[j] = sdslen(argv[j]);
-
- reply = (redisReply *)redisCommandArgv(c, argc, (const char **)argv, argvlen);
- if (reply) {
- //printf("RedisCommandArgv return: %lld\n", reply->integer);
- }
- free(argvlen);
- sdsfreesplitres(argv, argc);
- return reply;
-}
-
-int rd_mutex_unlock(struct rd_lock_scb *mtx, struct redisContext *c)
-{
- int argc = 5;
- struct rd_RedLock *redlock = mutx_redlock();
-
- char *unlockScriptArgv[] = {(char*)"EVAL",
- redlock->m_unlockScript,
- (char*)"1",
- (char*)mtx->m_resource,
- (char*)mtx->m_val};
-
- redisReply *reply = rd_command_argv(c, argc, unlockScriptArgv);
- if (reply) {
- freeReplyObject(reply);
- }
-
- sdsfree(mtx->m_resource);
- sdsfree(mtx->m_val);
-
- return 0;
-}
-
-/*
- ttl ms
-*/
-
-int rd_mutex_lock(const char *key, const int ttl,
- struct rd_lock_scb *mtx, struct redisContext *c)
-{
- char *val = NULL;
- int xret = 0;
- struct rd_RedLock *redlock = mutx_redlock();
-
-
- val = get_unique_lockid();
- if (!val) {
- return xret;
- }
- mtx->m_resource = sdsnew(key);
- mtx->m_val = val;
-
- int end = (int)time(NULL) * 1000 + ttl;
-
- while((int)time(NULL) * 1000 < end){
- int n = 0;
-
- int startTime = (int)time(NULL) * 1000;
-
- if (c == NULL || c->err) {
- goto finish;
- }
-
- if (rd_lock_instance(c, key, val, ttl)) {
- n++;
- }
-
- int validityTime = ttl - ((int)time(NULL) * 1000 - startTime);
- if (n > 0 && validityTime > 0) {
- mtx->m_validityTime = validityTime;
- xret = 1;
- goto finish;
- }
-
- int delay = redlock->m_retryDelay;
- usleep(delay * 1000);
- }
-
-finish:
- return xret;
-}
-
-
-/* redis lock*/
-int rd_mutex_lock_bak(const char *key, const int ttl,
- struct rd_lock_scb *mtx, struct redisContext *c)
-{
- struct rd_RedLock *redlock = mutx_redlock();
-
- char *val = NULL;
- int retryCount =0, xret = 0;
-
- val = get_unique_lockid();
- if (!val) {
- return xret;
- }
- mtx->m_resource = sdsnew(key);
- mtx->m_val = val;
- retryCount = redlock->m_retryCount;
-
- do {
- int n = 0;
- int startTime = (int)time(NULL) * 1000;
-
- if (c == NULL || c->err) {
- goto finish;
- }
-
- if (rd_lock_instance(c, key, val, ttl)) {
- n++;
- }
-
- int drift = (ttl * redlock->m_clockDriftFactor) + 2;
- int validityTime = ttl - ((int)time(NULL) * 1000 - startTime) - drift;
- printf("The resource validty time is %d, n is %d\n",
- validityTime, n);
-
- if (n > 0 && validityTime > 0) {
- mtx->m_validityTime = validityTime;
- xret = 1;
- goto finish;
- } else {
- printf("The resource validty time is %d, n is %d\n",
- validityTime, n);
- }
- // Wait a random delay before to retry
- int delay = rand() % redlock->m_retryDelay + floor(redlock->m_retryDelay / 2);
- //printf("[Test] delay = %d\n", delay);
- usleep(delay * 1000);
- retryCount--;
- } while (retryCount > 0);
-
-finish:
- return xret;
-}
-
-void rd_lock_init()
-{
- struct rd_RedLock *rdlock = mutx_redlock();
-
- rdlock->m_unlockScript = sdsnew("if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end");
- rdlock->m_retryCount = 3;
- rdlock->m_retryDelay = 10;
- rdlock->m_clockDriftFactor = 0.01;
-
- return;
-}
-
-void rd_lock_fini()
-{
- struct rd_RedLock *rdlock = mutx_redlock();
-
- sdsfree(rdlock->m_unlockScript);
-}
-
diff --git a/src/components/redis/rd_lock.h b/src/components/redis/rd_lock.h
deleted file mode 100644
index 171bb00..0000000
--- a/src/components/redis/rd_lock.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*************************************************************************
- > File Name: rd_lock.h
- > Author:
- > Mail:
- > Created Time: 2018年07月05日 星期四 11时02分03秒
- ************************************************************************/
-
-#ifndef _RD_LOCK_H
-#define _RD_LOCK_H
-
-#include "hiredis.h"
-
-struct rd_lock_scb{
- int m_validityTime;
- sds m_resource;
- sds m_val;
-};
-
-void rd_lock_init();
-
-void rd_lock_fini();
-
-int rd_mutex_lock(const char *resource, const int ttl,
- struct rd_lock_scb *mtx, struct redisContext *c);
-
-int rd_mutex_unlock(struct rd_lock_scb *mtx, struct redisContext *c);
-
-#endif
diff --git a/src/components/redis/read.h b/src/components/redis/read.h
deleted file mode 100644
index 2988aa4..0000000
--- a/src/components/redis/read.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>
- * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Redis nor the names of its contributors may be used
- * to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __HIREDIS_READ_H
-#define __HIREDIS_READ_H
-#include <stdio.h> /* for size_t */
-
-#define REDIS_ERR -1
-#define REDIS_OK 0
-
-/* When an error occurs, the err flag in a context is set to hold the type of
- * error that occurred. REDIS_ERR_IO means there was an I/O error and you
- * should use the "errno" variable to find out what is wrong.
- * For other values, the "errstr" field will hold a description. */
-#define REDIS_ERR_IO 1 /* Error in read or write */
-#define REDIS_ERR_EOF 3 /* End of file */
-#define REDIS_ERR_PROTOCOL 4 /* Protocol error */
-#define REDIS_ERR_OOM 5 /* Out of memory */
-#define REDIS_ERR_OTHER 2 /* Everything else... */
-
-#define REDIS_REPLY_STRING 1
-#define REDIS_REPLY_ARRAY 2
-#define REDIS_REPLY_INTEGER 3
-#define REDIS_REPLY_NIL 4
-#define REDIS_REPLY_STATUS 5
-#define REDIS_REPLY_ERROR 6
-
-#define REDIS_READER_MAX_BUF (1024*16) /* Default max unused reader buffer. */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct redisReadTask {
- int type;
- int elements; /* number of elements in multibulk container */
- int idx; /* index in parent (array) object */
- void *obj; /* holds user-generated value for a read task */
- struct redisReadTask *parent; /* parent task */
- void *privdata; /* user-settable arbitrary field */
-} redisReadTask;
-
-typedef struct redisReplyObjectFunctions {
- void *(*createString)(const redisReadTask*, char*, size_t);
- void *(*createArray)(const redisReadTask*, int);
- void *(*createInteger)(const redisReadTask*, long long);
- void *(*createNil)(const redisReadTask*);
- void (*freeObject)(void*);
-} redisReplyObjectFunctions;
-
-typedef struct redisReader {
- int err; /* Error flags, 0 when there is no error */
- char errstr[128]; /* String representation of error when applicable */
-
- char *buf; /* Read buffer */
- size_t pos; /* Buffer cursor */
- size_t len; /* Buffer length */
- size_t maxbuf; /* Max length of unused buffer */
-
- redisReadTask rstack[9];
- int ridx; /* Index of current read task */
- void *reply; /* Temporary reply pointer */
-
- redisReplyObjectFunctions *fn;
- void *privdata;
-} redisReader;
-
-/* Public API for the protocol parser. */
-redisReader *redisReaderCreateWithFunctions(redisReplyObjectFunctions *fn);
-void redisReaderFree(redisReader *r);
-int redisReaderFeed(redisReader *r, const char *buf, size_t len);
-int redisReaderGetReply(redisReader *r, void **reply);
-
-#define redisReaderSetPrivdata(_r, _p) (int)(((redisReader*)(_r))->privdata = (_p))
-#define redisReaderGetObject(_r) (((redisReader*)(_r))->reply)
-#define redisReaderGetError(_r) (((redisReader*)(_r))->errstr)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/components/redis/redis.mk b/src/components/redis/redis.mk
deleted file mode 100644
index 5baf45d..0000000
--- a/src/components/redis/redis.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-# standard component Makefile header
-sp := $(sp).x
-dirstack_$(sp) := $(d)
-d := $(dir)
-
-# component specification
-
-OBJS_$(d) :=\
- $(OBJ_DIR)/rd_lock.o\
-
-CFLAGS_LOCAL += -I$(d)
-$(OBJS_$(d)): CFLAGS_LOCAL := -std=gnu99 -W -Wall -Wunused-parameter -g -O3 \
- -I$(d)\
- -I$(d)/../../rt\
- -I$(d)/../../inc\
-
-
-# standard component Makefile rules
-
-DEPS_$(d) := $(OBJS_$(d):.o=.d)
-
-#LIBS_LIST := $(LIBS_LIST) $(LIBRARY)
-LIBS_LIST := $(LIBS_LIST)
-
-CLEAN_LIST := $(CLEAN_LIST) $(OBJS_$(d)) $(DEPS_$(d))
-
--include $(DEPS_$(d))
-
-#$(LIBRARY): $(OBJS)
-# $(MYARCHIVE)
-
-$(OBJ_DIR)/%.o: $(d)/%.c
- $(COMPILE)
-
-# standard component Makefile footer
-
-d := $(dirstack_$(sp))
-sp := $(basename $(sp))
diff --git a/src/components/redis/sds.h b/src/components/redis/sds.h
deleted file mode 100644
index 13be75a..0000000
--- a/src/components/redis/sds.h
+++ /dev/null
@@ -1,273 +0,0 @@
-/* SDSLib 2.0 -- A C dynamic strings library
- *
- * Copyright (c) 2006-2015, Salvatore Sanfilippo <antirez at gmail dot com>
- * Copyright (c) 2015, Oran Agra
- * Copyright (c) 2015, Redis Labs, Inc
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Redis nor the names of its contributors may be used
- * to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 __SDS_H
-#define __SDS_H
-
-#define SDS_MAX_PREALLOC (1024*1024)
-
-#include <sys/types.h>
-#include <stdarg.h>
-#include <stdint.h>
-
-typedef char *sds;
-
-/* Note: sdshdr5 is never used, we just access the flags byte directly.
- * However is here to document the layout of type 5 SDS strings. */
-struct __attribute__ ((__packed__)) sdshdr5 {
- unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
- char buf[];
-};
-struct __attribute__ ((__packed__)) sdshdr8 {
- uint8_t len; /* used */
- uint8_t alloc; /* excluding the header and null terminator */
- unsigned char flags; /* 3 lsb of type, 5 unused bits */
- char buf[];
-};
-struct __attribute__ ((__packed__)) sdshdr16 {
- uint16_t len; /* used */
- uint16_t alloc; /* excluding the header and null terminator */
- unsigned char flags; /* 3 lsb of type, 5 unused bits */
- char buf[];
-};
-struct __attribute__ ((__packed__)) sdshdr32 {
- uint32_t len; /* used */
- uint32_t alloc; /* excluding the header and null terminator */
- unsigned char flags; /* 3 lsb of type, 5 unused bits */
- char buf[];
-};
-struct __attribute__ ((__packed__)) sdshdr64 {
- uint64_t len; /* used */
- uint64_t alloc; /* excluding the header and null terminator */
- unsigned char flags; /* 3 lsb of type, 5 unused bits */
- char buf[];
-};
-
-#define SDS_TYPE_5 0
-#define SDS_TYPE_8 1
-#define SDS_TYPE_16 2
-#define SDS_TYPE_32 3
-#define SDS_TYPE_64 4
-#define SDS_TYPE_MASK 7
-#define SDS_TYPE_BITS 3
-#define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T)));
-#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))
-#define SDS_TYPE_5_LEN(f) ((f)>>SDS_TYPE_BITS)
-
-static inline size_t sdslen(const sds s) {
- unsigned char flags = s[-1];
- switch(flags&SDS_TYPE_MASK) {
- case SDS_TYPE_5:
- return SDS_TYPE_5_LEN(flags);
- case SDS_TYPE_8:
- return SDS_HDR(8,s)->len;
- case SDS_TYPE_16:
- return SDS_HDR(16,s)->len;
- case SDS_TYPE_32:
- return SDS_HDR(32,s)->len;
- case SDS_TYPE_64:
- return SDS_HDR(64,s)->len;
- }
- return 0;
-}
-
-static inline size_t sdsavail(const sds s) {
- unsigned char flags = s[-1];
- switch(flags&SDS_TYPE_MASK) {
- case SDS_TYPE_5: {
- return 0;
- }
- case SDS_TYPE_8: {
- SDS_HDR_VAR(8,s);
- return sh->alloc - sh->len;
- }
- case SDS_TYPE_16: {
- SDS_HDR_VAR(16,s);
- return sh->alloc - sh->len;
- }
- case SDS_TYPE_32: {
- SDS_HDR_VAR(32,s);
- return sh->alloc - sh->len;
- }
- case SDS_TYPE_64: {
- SDS_HDR_VAR(64,s);
- return sh->alloc - sh->len;
- }
- }
- return 0;
-}
-
-static inline void sdssetlen(sds s, size_t newlen) {
- unsigned char flags = s[-1];
- switch(flags&SDS_TYPE_MASK) {
- case SDS_TYPE_5:
- {
- unsigned char *fp = ((unsigned char*)s)-1;
- *fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS);
- }
- break;
- case SDS_TYPE_8:
- SDS_HDR(8,s)->len = newlen;
- break;
- case SDS_TYPE_16:
- SDS_HDR(16,s)->len = newlen;
- break;
- case SDS_TYPE_32:
- SDS_HDR(32,s)->len = newlen;
- break;
- case SDS_TYPE_64:
- SDS_HDR(64,s)->len = newlen;
- break;
- }
-}
-
-static inline void sdsinclen(sds s, size_t inc) {
- unsigned char flags = s[-1];
- switch(flags&SDS_TYPE_MASK) {
- case SDS_TYPE_5:
- {
- unsigned char *fp = ((unsigned char*)s)-1;
- unsigned char newlen = SDS_TYPE_5_LEN(flags)+inc;
- *fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS);
- }
- break;
- case SDS_TYPE_8:
- SDS_HDR(8,s)->len += inc;
- break;
- case SDS_TYPE_16:
- SDS_HDR(16,s)->len += inc;
- break;
- case SDS_TYPE_32:
- SDS_HDR(32,s)->len += inc;
- break;
- case SDS_TYPE_64:
- SDS_HDR(64,s)->len += inc;
- break;
- }
-}
-
-/* sdsalloc() = sdsavail() + sdslen() */
-static inline size_t sdsalloc(const sds s) {
- unsigned char flags = s[-1];
- switch(flags&SDS_TYPE_MASK) {
- case SDS_TYPE_5:
- return SDS_TYPE_5_LEN(flags);
- case SDS_TYPE_8:
- return SDS_HDR(8,s)->alloc;
- case SDS_TYPE_16:
- return SDS_HDR(16,s)->alloc;
- case SDS_TYPE_32:
- return SDS_HDR(32,s)->alloc;
- case SDS_TYPE_64:
- return SDS_HDR(64,s)->alloc;
- }
- return 0;
-}
-
-static inline void sdssetalloc(sds s, size_t newlen) {
- unsigned char flags = s[-1];
- switch(flags&SDS_TYPE_MASK) {
- case SDS_TYPE_5:
- /* Nothing to do, this type has no total allocation info. */
- break;
- case SDS_TYPE_8:
- SDS_HDR(8,s)->alloc = newlen;
- break;
- case SDS_TYPE_16:
- SDS_HDR(16,s)->alloc = newlen;
- break;
- case SDS_TYPE_32:
- SDS_HDR(32,s)->alloc = newlen;
- break;
- case SDS_TYPE_64:
- SDS_HDR(64,s)->alloc = newlen;
- break;
- }
-}
-
-sds sdsnewlen(const void *init, size_t initlen);
-sds sdsnew(const char *init);
-sds sdsempty(void);
-sds sdsdup(const sds s);
-void sdsfree(sds s);
-sds sdsgrowzero(sds s, size_t len);
-sds sdscatlen(sds s, const void *t, size_t len);
-sds sdscat(sds s, const char *t);
-sds sdscatsds(sds s, const sds t);
-sds sdscpylen(sds s, const char *t, size_t len);
-sds sdscpy(sds s, const char *t);
-
-sds sdscatvprintf(sds s, const char *fmt, va_list ap);
-#ifdef __GNUC__
-sds sdscatprintf(sds s, const char *fmt, ...)
- __attribute__((format(printf, 2, 3)));
-#else
-sds sdscatprintf(sds s, const char *fmt, ...);
-#endif
-
-sds sdscatfmt(sds s, char const *fmt, ...);
-sds sdstrim(sds s, const char *cset);
-void sdsrange(sds s, int start, int end);
-void sdsupdatelen(sds s);
-void sdsclear(sds s);
-int sdscmp(const sds s1, const sds s2);
-sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);
-void sdsfreesplitres(sds *tokens, int count);
-void sdstolower(sds s);
-void sdstoupper(sds s);
-sds sdsfromlonglong(long long value);
-sds sdscatrepr(sds s, const char *p, size_t len);
-sds *sdssplitargs(const char *line, int *argc);
-sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);
-sds sdsjoin(char **argv, int argc, char *sep);
-sds sdsjoinsds(sds *argv, int argc, const char *sep, size_t seplen);
-
-/* Low level functions exposed to the user API */
-sds sdsMakeRoomFor(sds s, size_t addlen);
-void sdsIncrLen(sds s, int incr);
-sds sdsRemoveFreeSpace(sds s);
-size_t sdsAllocSize(sds s);
-void *sdsAllocPtr(sds s);
-
-/* Export the allocator used by SDS to the program using SDS.
- * Sometimes the program SDS is linked to, may use a different set of
- * allocators, but may want to allocate or free things that SDS will
- * respectively free or allocate. */
-void *sds_malloc(size_t size);
-void *sds_realloc(void *ptr, size_t size);
-void sds_free(void *ptr);
-
-#ifdef REDIS_TEST
-int sdsTest(int argc, char *argv[]);
-#endif
-
-#endif
diff --git a/src/components/syslogd/logging.c b/src/components/syslogd/logging.c
deleted file mode 100644
index fc80e68..0000000
--- a/src/components/syslogd/logging.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*************************************************************************
- > File Name: logging.c
- > Author:
- > Mail:
- > Created Time: 2018年06月18日 星期一 22时45分43秒
- ************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <dirent.h>
-#include <ctype.h>
-
-#include "rt_common.h"
-#include "rt_time.h"
-#include "rt_string.h"
-#include "logging.h"
-#include "MESA_prof_load.h"
-#include "MESA_handle_logger.h"
-
-void mesa_logging_print(int log_level, char *module, char *msg)
-{
- MESA_handle_runtime_log(logging_sc_lid.run_log_handle, log_level, module, msg);
- return;
-}
-
-void cert_syslog_init(char *config)
-{
- char run_log_path[256] = {0};
-
- MESA_load_profile_int_def(config, (const char *)"SYSTEM",(const char *)"DEBUG_SWITCH",
- &logging_sc_lid.debug_switch, 1);
- MESA_load_profile_int_def(config, (const char *)"SYSTEM",(const char *)"RUN_LOG_LEVEL",
- &logging_sc_lid.run_log_level, 10);
- MESA_load_profile_string_def(config, (const char *)"SYSTEM",(const char *)"RUN_LOG_PATH",
- logging_sc_lid.run_log_path, 128, NULL);
-
- snprintf(run_log_path, 255, "%s/%s", logging_sc_lid.run_log_path, "certstore.log");
-
- logging_sc_lid.run_log_handle = MESA_create_runtime_log_handle(run_log_path, logging_sc_lid.run_log_level);
- if(logging_sc_lid.run_log_handle == NULL){
- mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Create log runtime_log_handle error, init failed!");
- goto finish;
- }else{
- mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Log module initialization");
- }
-finish:
- return;
-}
-
-
diff --git a/src/components/syslogd/logging.h b/src/components/syslogd/logging.h
deleted file mode 100644
index 7e9a338..0000000
--- a/src/components/syslogd/logging.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*************************************************************************
- > File Name: logging.h
- > Author:
- > Mail:
- > Created Time: 2018年06月18日 星期一 22时45分58秒
- ************************************************************************/
-
-#ifndef _LOGGING_H
-#define _LOGGING_H
-
-#define MODULE_NAME "CA"
-
-#define RLOG_LV_DEBUG 10
-#define RLOG_LV_INFO 20
-#define RLOG_LV_FATAL 30
-
-typedef struct RTLogInit2Data_ {
- int debug_switch;
-
- int run_log_level;
-
- char run_log_path[256];
-
- void *run_log_handle;
-} RTLogInit2Data;
-
-RTLogInit2Data logging_sc_lid;
-
-/* The maximum length of the log message */
-#define RT_LOG_MAX_LOG_MSG_LEN 2048
-
-extern void mesa_logging_print(int log_level, char *module, char *msg);
-
-#define mesa_log(x, y, z, ...) do { \
- char _sc_log_msg[RT_LOG_MAX_LOG_MSG_LEN] = ""; \
- char *_sc_log_temp = _sc_log_msg; \
- if ( !x ) \
- { } else { \
- snprintf(_sc_log_temp, \
- (RT_LOG_MAX_LOG_MSG_LEN - \
- (_sc_log_temp - _sc_log_msg)), \
- __VA_ARGS__); \
- mesa_logging_print(y, z, _sc_log_msg); \
- } \
- } while(0)
-
-#define mesa_runtime_log(level, module, ...) mesa_log(logging_sc_lid.debug_switch, level, module, __VA_ARGS__)
-
-extern void cert_syslog_init(char *config);
-
-#endif
diff --git a/src/components/syslogd/syslog.mk b/src/components/syslogd/syslog.mk
deleted file mode 100644
index 58ae5e1..0000000
--- a/src/components/syslogd/syslog.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-# standard component Makefile header
-sp := $(sp).x
-dirstack_$(sp) := $(d)
-d := $(dir)
-
-# component specification
-
-OBJS_$(d) :=\
- $(OBJ_DIR)/logging.o\
-
-CFLAGS_LOCAL += -I$(d)
-$(OBJS_$(d)): CFLAGS_LOCAL := -std=gnu99 -W -Wall -Wunused-parameter -g -O3 \
- -I$(d)\
- -I$(d)/../../rt\
- -I$(d)/../../inc\
-
-
-# standard component Makefile rules
-
-DEPS_$(d) := $(OBJS_$(d):.o=.d)
-
-#LIBS_LIST := $(LIBS_LIST) $(LIBRARY)
-LIBS_LIST := $(LIBS_LIST)
-
-CLEAN_LIST := $(CLEAN_LIST) $(OBJS_$(d)) $(DEPS_$(d))
-
--include $(DEPS_$(d))
-
-#$(LIBRARY): $(OBJS)
-# $(MYARCHIVE)
-
-$(OBJ_DIR)/%.o: $(d)/%.c
- $(COMPILE)
-
-# standard component Makefile footer
-
-d := $(dirstack_$(sp))
-sp := $(basename $(sp))
diff --git a/src/inc/MESA_atomic.h b/src/inc/MESA_atomic.h
deleted file mode 100644
index 76e5b80..0000000
--- a/src/inc/MESA_atomic.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef _MESA_ATOMIC_H_
-#define _MESA_ATOMIC_H_
-
-
-#if(__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__ >= 411)
-typedef unsigned long MESA_ATOMIC_T;
-#define MESA_ATOMIC_SET(v, i) __sync_lock_test_and_set((&v), i)
-#define MESA_ATOMIC_READ(v) __sync_or_and_fetch((&v), 0)
-#define MESA_ATOMIC_INC(v) __sync_add_and_fetch((&v),1)
-#define MESA_ATOMIC_DEC(v) __sync_sub_and_fetch((&v),1)
-#define MESA_ATOMIC_ADD(v,add) __sync_add_and_fetch((&v),(add))
-#define MESA_ATOMIC_SUB(v,sub) __sync_sub_and_fetch((&v),(sub))
-#else
-#include <alsa/iatomic.h>
-typedef atomic_t MESA_ATOMIC_T;
-#define MESA_ATOMIC_SET(v, i) atomic_set((&v), i)
-#define MESA_ATOMIC_READ(v) atomic_read((&v))
-#define MESA_ATOMIC_INC(v) atomic_inc((&v))
-#define MESA_ATOMIC_DEC(v) atomic_dec((&v))
-#define MESA_ATOMIC_ADD(v, add) atomic_add((add),(&v))
-#define MESA_ATOMIC_SUB(v, sub) atomic_sub((sub),(&v))
-#endif
-
-
-#ifdef __tilegx__
-#include <arch/atomic.h>
-typedef int MESA_ATOMIC_T;
-#define MESA_ATOMIC_SET(v, i) arch_atomic_exchange((&v), i)
-#define MESA_ATOMIC_READ(v) arch_atomic_or((&v), 0)
-#define MESA_ATOMIC_INC(v) arch_atomic_add((&v), 1)
-#define MESA_ATOMIC_DEC(v) arch_atomic_sub((&v), 1)
-#define MESA_ATOMIC_ADD(v, add) arch_atomic_add((&v), add)
-#define MESA_ATOMIC_SUB(v, sub) arch_atomic_sub((&v), sub)
-#endif
-
-
-#endif
-
diff --git a/src/inc/MESA_handle_logger.h b/src/inc/MESA_handle_logger.h
deleted file mode 100644
index 735a9f1..0000000
--- a/src/inc/MESA_handle_logger.h
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef MESA_HANDLE__LOGGER_H
-#define MESA_HANDLE__LOGGER_H
-
-/*
- * runtime_log with handle,
- * based on runtime_log.
- * yang wei
- * create time:2014-03-24
- * version:20140324
- */
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define MESA_HANDLE_RUNTIME_LOG(handle, lv, mod, fmt, args...) \
- MESA_handle_runtime_log((handle), (lv), (mod), "file %s, line %d, " fmt, \
- __FILE__, __LINE__, ##args)
-
-/*
- * name: MESA_create_runtime_log_handle
- * functionality: get runtime_log handle;
- * params:
- * file_path: path of log file, like "./log/runtime_log";
- * level: level of log;
- * returns:
- * not NULL, if succeeded;
- * NULL, if file is not absolute path, or failed to create log file;
- */
-void *MESA_create_runtime_log_handle(const char *file_path, int level);
-
-/*
- * name: MESA_handle_runtime_log
- * functionality: appends log message to runtime log file;
- * params:
- * handle:handle of runtime log, which is created by MESA_create_runtime_log_handle;
- * level: log level, messages with level value smaller the global var
- * "runtime_log_level" are ignored;
- * module: name of loggin module;
- * fmt: format string;
- * returns:
- * none;
- */
-void MESA_handle_runtime_log(void *handle, int level, const char *module, const char *fmt, ...);
-
-/*
- * name: MESA_destroy_runtime_log_handle
- * functionality: release runtime log handle memory.
- * params:
- * handle: runtime log handle which is going to be released;
- * returns:
- * none;
- */
-void MESA_destroy_runtime_log_handle(void *handle);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-
diff --git a/src/inc/MESA_htable.h b/src/inc/MESA_htable.h
deleted file mode 100644
index ac7c2b2..0000000
--- a/src/inc/MESA_htable.h
+++ /dev/null
@@ -1,419 +0,0 @@
-#ifndef __MESA_HTABLE_H_
-#define __MESA_HTABLE_H_
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <pthread.h>
-
-/*
- * general purpose hash table implementation.
- *
- * xiang hong
- * 2002-07-28
- *History:
- * 2012-03-23 zhengchao add thread safe option and link expire feature;
- * 2014-01-27 lijia add reentrant feature.
- */
-#define MESA_HTABLE_VERSION_MACRO (20170104)
-extern const unsigned int MESA_HTABLE_VERSION_INT;
-
-#define MESA_HASH_DEBUG (0)
-
-#define COMPLEX_KEY_SWITCH (1)
-
-#define ELIMINATE_TYPE_NUM (1)
-#define ELIMINATE_TYPE_TIME (2)
-#define ELIMINATE_TYPE_MANUAL (3) /* delete oldest item by manual */
-
-typedef void * MESA_htable_handle;
-
-
-#define HASH_MALLOC(_n_) malloc(_n_)
-#define HASH_FREE(_p_) free(_p_)
-
-
-#ifndef uchar
-#define uchar unsigned char
-#endif
-#ifndef uint
-#define uint unsigned int
-#endif
-
-/* eliminate algorithm */
-#define HASH_ELIMINATE_ALGO_FIFO (0) /* by default */
-#define HASH_ELIMINATE_ALGO_LRU (1)
-
-/*
- * hash key compare function prototype, see hash_key_comp().
- * return value:
- * 0:key1 and key2 are equal;
- * other:key1 and key2 not equal.
- */
-typedef int key_comp_fun_t(const uchar * key1, uint size1, const uchar * key2, uint size2);
-
-/*
- * hash key->index computing function prototype, see hash_key2index().
- */
-typedef uint key2index_fun_t(const MESA_htable_handle table, const uchar * key, uint size);
-
-typedef void MESA_htable_data_free_cbfun_t(void *data);
-
-typedef int MESA_htable_expire_notify_cbfun_t(void *data, int eliminate_type);
-
-typedef uchar* MESA_htable_complex_key_dup_cbfun_t(const uchar *key, uint key_size);
-
-typedef void MESA_htable_complex_key_free_cbfun_t(uchar *key, uint key_size);
-
-typedef long hash_cb_fun_t(void *data, const uchar *key, uint size, void *user_arg);
-
-/*
- * thread_safe: 0:create hash table without thread safe features;
- * positive:the bigger number has more performance, less collide, but less timeout accuracy.
- * max number is 1024.
- * recursive: 0:can't recursive call MESA_htable_xxx series function
- * 1:can recursive call MESA_htable_xxx series function.
- * hash_slot_size: how big do you want the table to be, must be 2^N;
- * max_elem_num: the maximum elements of the HASH-table,0 means infinite;
- * key_comp: hash key compare function, use default function if NULL;
- * suggest implement by yourself.
- * key2index: hash key->index computing function, use default function if NULL;
- * suggest use MESA_htable built-in function.
- * data_free: release resources function;
- * data_expire_with_condition:
- * if expire_time > 0 and data_expire_with_condition != NULL,
- * then call this function when an element expired, and give the reason by the 'type'
- * if expire_time > 0 and data_expire_with_condition is NULL,
- * eliminate the item immediately;
- * args:
- * data: pointer to attached data;
- * type: item eliminate reason, ELIMINATE_TYPE_NUM or ELIMINATE_TYPE_TIME;
- * return value of 'data_expire_with_condition':
- * 1: the item can be eliminated;
- * 0: the item can't be eliminated, renew the item.
- * eliminate_type: the algorithm of elimanate a expired element, 0:FIFO; 1:LRU.
- * expire_time: the element expire time in second, 0 means infinite.
- */
-typedef struct{
- unsigned int thread_safe;
- int recursive;
- unsigned int hash_slot_size;
- unsigned int max_elem_num;
- int eliminate_type;
- int expire_time;
- key_comp_fun_t * key_comp;
- key2index_fun_t * key2index;
- void (* data_free)(void *data);
- int (*data_expire_with_condition)(void *data, int eliminate_type);
-#if COMPLEX_KEY_SWITCH
- uchar* (*complex_key_dup)(const uchar *key, uint key_size);
- void (* complex_key_free)(uchar *key, uint key_size);
-#endif
-}MESA_htable_create_args_t;
-
-
-/* All of the following functions return value */
-typedef enum{
- MESA_HTABLE_RET_OK = 0, /* success */
- MESA_HTABLE_RET_COMMON_ERR = -1, /* general��undefined errors */
- MESA_HTABLE_RET_ARG_ERR = -2, /* invalid args */
- MESA_HTABLE_RET_NUM_FULL = -3, /* htable number full */
- MESA_HTABLE_RET_QEMPTY = -4, /* htable empty */
- MESA_HTABLE_RET_DUP_ITEM = -5, /* duplicate item */
- MESA_HTABLE_RET_NOT_FOUND = -6, /* not found item */
- MESA_HTABLE_RET_LEN_ERR = -7, /* length error */
- MESA_HTABLE_RET_CANT_GET_LOCK = -8, /* can't get lock in non-block mode */
- MESA_HTABLE_RET_GET_LOCK_TMOUT = -9, /* get lock timeout */
-}MESA_htable_errno_t;
-
-/*
- * You should never use this API to create a hash table, use MESA_htable_born() instead.
- * name: MESA_htable_create
- * functionality: allocats memory for hash slots, and initialize hash structure;
- * param:
- * args: argments set;
- * args_len: length of argment set;
- * returns:
- * NULL : error;
- * Non-NULL : success;
- */
-MESA_htable_handle MESA_htable_create(const MESA_htable_create_args_t *args, int args_struct_len);
-
-/*
- * get total number of HASH element.
-*/
-unsigned int MESA_htable_get_elem_num(const MESA_htable_handle table);
-
-/*
- * name: MESA_htable_destroy
- * functionality: cleans up hash structure, frees memory occupied;
- * param:
- * table: who is the victim;
- * func: callback function to clean up data attached to hash items, has higher priority level than MESA_htable_data_free_cbfun_t in initialization.
-
- * returns:
- * always returns 0;
- */
-int MESA_htable_destroy(MESA_htable_handle table, void (* func)(void *));
-
-/*
- * name: MESA_htable_add
- * functionality: adds item to table, call hash_expire() if elem_count gets
- * bigger than threshold_hi, and adjust threshold;
- * param:
- * table: to which table do you want to add;
- * key: what is the label;
- * size: how long is the label;
- * data: what data do you want to attach;
- * returns:
- * >0: success,return hash elems' linklist size;
- * 0: success.
- * <0: error, refer to MESA_htable_errno_t.
- */
-int MESA_htable_add(MESA_htable_handle table, const uchar * key, uint size, const void *data);
-
-/*
- TODO,
- sturct hash_status{
- uint hlist_max;
- uint hlist_max_slot_index;
- uint cur_index_hlist_num;
- uint hash_value;
- };
-
- ����MESA_htable_add_feedback(MESA_htable_handle table, const uchar * key, uint size, const void *data, sturct hash_status *hstat);
- ���ڷ���HASH����һЩ�ؼ���Ϣ,
-
-*/
-
-#if 0
-/*
- * name: hash_add_with_expire
- * functionality: adds item to table, than call hash_expire() on its list
- * param:
- * table: to which table do you want to add;
- * key: what is the label;
- * size: how long is the label;
- * data: what data do you want to attach;
- * returns:
- * >0 success,return hash elems' linklist size
- * -1, duplicates found and can't add this one;
- * -2, memory failure;
- */
-int MESA_hash_add_with_expire_v3(MESA_htable_inner_t * table, uchar * key, uint size, void * data);
-
-#endif
-
-
-/*
- * name: MESA_htable_del
- * functionality: deletes item from table.
- * param:
- * table: from which table do you want to delete;
- * key : what is the label;
- * size : how long is the label;
- * func : callback function to clean up data attached to hash items,
- if this pointer is NULL will call "data_free" in MESA_hash_create(),
- * returns:
- * 0 : success;
- * <0: error, refer to MESA_htable_errno_t.
- */
-int MESA_htable_del(MESA_htable_handle table, const uchar * key, uint size,
- void (* func)(void *));
-/*
- TODO:
- ����MESA_htable_del_with_hash(MESA_htable_handle table, const uchar * key, uint size, uint hash_value,
- void (* func)(void *));
- ɾ��ʱ����֮ǰ��hash_value, ����һ��hash���㿪��,
-*/
-
-
-/*
- * name: MESA_htable_del_oldest_manual
- * functionality: deletes oldest item from table.
- * param:
- * table: from which table do you want to delete;
- * func : callback function to clean up data attached to hash items,
- if this pointer is NULL will call "data_free" in MESA_hash_create(),
- * batch_num: delete oldest items.
- * returns:
- * 0, do nothing ;
- * >0, delete items;
- */
-int MESA_htable_del_oldest_manual(MESA_htable_handle table, void (* func)(void *), int batch_num);
-
-/*
- * name: MESA_htable_search
- * functionality: selects item from table;
- * param:
- * table: from which table do you want to select;
- * key : what is the label;
- * size : how long is the label;
- *
- * return:
- * not NULL :pointer to attached data;
- * NULL :not found(thus be careful if you are attaching NULL data on purpose).
- */
-void *MESA_htable_search(const MESA_htable_handle table, const uchar * key, uint size);
-
-/*
- * name: MESA_htable_search_cb
- * functionality: selects item from table, and then call 'cb', reentrant;
- * in param:
- * table: from which table do you want to select;
- * key : what is the label;
- * size : how long is the label;
- * cb : call this function when found the attached data;
- * arg : the argument of "cb" function.
- * out param:
- * cb_ret: the return value of the function "cb".
- * return:
- * not NULL :pointer to attached data;
- * NULL :not found(thus be careful if you are attaching NULL data on purpose).
- */
-void *MESA_htable_search_cb(const MESA_htable_handle table, const uchar * key, uint size,
- hash_cb_fun_t *cb, void *arg, long *cb_ret);
-
-/*
- * name: MESA_htable_iterate
- * functionality: iterates each hash item;
- * params:
- * table: what table is to be iterated;
- * func: what do you want to do to each attached data item;
- * returns:
- * 0: iterates all items;
- * -1: error;
- */
-int MESA_htable_iterate(MESA_htable_handle table,
- void (* func)(const uchar * key, uint size, void * data, void *user), void * user);
-
-
-/*
- * name: MESA_htable_iterate_bytime
- * functionality: iterates each hash item by your demand;
- * note:
- * if 'thread_safe' more than one, this function is not correct.
- * params:
- * table: what table is to be iterated;
- * iterate_type: 1: newest item first; 2: oldest item first;
- * iterate_cb: what do you want to do to each attached data item;
- * return value of iterate_cb:
- * refer to ITERATE_CB_RET_xxx;
- * returns:
- * 0: iterates all items;
- * -1: uncomplete break.
- * -2: error;
- */
-#define ITERATE_CB_RET_CONTINUE_FLAG (0) /* default, like MESA_htable_iterate() */
-#define ITERATE_CB_RET_BREAK_FLAG (1<<1) /* break iterate, return from MESA_htable_iterate_bytime() immediately */
-#define ITERATE_CB_RET_DEL_FLAG (1<<2) /* del this item, like but faster than call MESA_htable_del() */
-#define ITERATE_CB_RET_REVERSE_FLAG (1<<3) /* if the item is newest item, it will become the oldest item, and vice versa */
-#define ITERATE_CB_RET_REMOVE_BUT_NOT_FREE (1<<4) /* only remove the item from Hash table, but don't free the attached data, be careful */
-
-#define ITERATE_TYPE_NEWEST_FIRST (1)
-#define ITERATE_TYPE_OLDEST_FIRST (2)
-int MESA_htable_iterate_bytime(MESA_htable_handle table, int iterate_type,
- int (*iterate_cb)(const uchar * key, uint size, void * data, void *user), void * user);
-
-/*
- args:
- print_switch:
- 0: disable print message;
- 1: enable print message;
-*/
-void MESA_htable_print_crtl(MESA_htable_handle table, int print_switch);
-
-
-/*
- Create a htable handle and Alloc memory, and set default option,
- but can't running before call MESA_htable_mature().
-
- return value:
- not NULL: success.
- NULL : error.
-*/
-MESA_htable_handle MESA_htable_born(void);
-
-/*
- MESA_htable option definition.
-*/
-enum MESA_htable_opt{
- MHO_THREAD_SAFE = 0, /* must be int, 1:create hash table with thread safe features, default is 0 */
- MHO_MUTEX_NUM, /* must be int, valid only if MHO_THREAD_SAFE is not zero, max value is 1024, defalut is 1. the bigger number has more performance and less mutex collide, but less timeout accuracy */
- MHO_HASH_SLOT_SIZE, /* must be unsigned int, default is 1048576. */
- MHO_HASH_MAX_ELEMENT_NUM, /* must be unsigned int, defalut is 0, means infinite */
- MHO_EXPIRE_TIME, /* must be int, defalut is 0, means infinite */
- MHO_ELIMIMINATE_TYPE, /* must be int, valid only if MHO_EXPIRE_TIME is not zero. HASH_ELIMINATE_ALGO_FIFO or HASH_ELIMINATE_ALGO_LRU, defalut HASH_ELIMINATE_ALGO_FIFO */
- MHO_CBFUN_KEY_COMPARE, /* must be key_comp_fun_t, hash key compare function, use default function if NULL */
- MHO_CBFUN_KEY_TO_INDEX, /* must be key2index_fun_t, hash key->index computing function, use default function if NULL */
- MHO_CBFUN_DATA_FREE, /* must be MESA_htable_data_free_cbfun_t, release resources function */
- /* data_expire_notify, must be MESA_htable_expire_notify_cbfun_t,
- * if expire_time > 0 and data_expire_notify != NULL,
- * then call this function when an element expired, and give the reason by the 'type'
- * if expire_time > 0 and data_expire_notify is NULL,
- * eliminate the item immediately;
- * args:
- * data: pointer to attached data;
- * type: item eliminate reason, ELIMINATE_TYPE_NUM or ELIMINATE_TYPE_TIME;
- * return value of 'data_expire_with_condition':
- * 1: the item can be eliminated;
- * 0: the item can't be eliminated, renew the item.
- */
- MHO_CBFUN_DATA_EXPIRE_NOTIFY,
- MHO_CBFUN_COMPLEX_KEY_DUP, /* must be MESA_htable_complex_key_dup_cbfun_t, if key store in a complex struct, caller must be implement this duplicate function. */
- MHO_CBFUN_COMPLEX_KEY_FREE, /* must be MESA_htable_complex_key_free_cbfun_t, if key store in a complex struct, caller must be implement this duplicate function. */
- MHO_AUTO_UPDATE_TIME, /* must be int, create a background thread used to update current_time instead of time(NULL). 1:enable; 0:disable; default value is 0; */
- MHO_SCREEN_PRINT_CTRL, /* must be int, 1:enable screen print; 0:disable screen print; default is 1. */
- MHO_HASH_LIST_COLLIDE_THRESHOLD, /* must be int, write log when hash collide number more than this, default is 100, 0 means infinite. */
- MHO_HASH_LOG_FILE, /* must be char * with EOF, default is "./hash_list_collide.log", opt_len is strlen(optval) */
- MHO_HASH_SEARCH_MAX_TIMES, /* must be int, max compare items in once MESA_htable_search() */
- MHO_HASH_SEARCH_AVG_TIMES, /* must be double, average compare items in all previous MESA_htable_search() */
- __MHO_MAX_VAL, /* caller can't use this definition, it's value maybe changed in next version!! */
-};
-
-
-/*
- to set features of specified MESA_htable handle.
- opt_type: option type, refer to enum MESA_htable_opt;
- opt_val : option value, depend on opt type;
- opt_len : opt_val size, depend on opt type;
-
- return value:
- 0 :success;
- <0:error;
-*/
-int MESA_htable_set_opt(MESA_htable_handle table, enum MESA_htable_opt opt_type, void *opt_val, int opt_len);
-
-/*
- to get features of specified MESA_htable handle.
- opt_type: option type, refer to enum MESA_htable_opt;
- opt_val : option value, depend on opt type;
- opt_len : value-result argument, opt_val size, depend on opt type;
-
- return value:
- 0 :success;
- <0:error;
-*/
-int MESA_htable_get_opt(MESA_htable_handle api_table, enum MESA_htable_opt opt_type, void *opt_val, int *opt_len);
-
-/*
- Construct htable and ready to running.
-
- return value:
- 0 : success;
- <0: error.
-*/
-int MESA_htable_mature(MESA_htable_handle table);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _LIB_HASH_H_INCLUDED_ */
-
-
diff --git a/src/inc/MESA_list.h b/src/inc/MESA_list.h
deleted file mode 100644
index 6ad7c45..0000000
--- a/src/inc/MESA_list.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef _MESA_LIST_H_
-#define _MESA_LIST_H_
-
-typedef struct MESA_list{
- struct MESA_list *nextele;
- struct MESA_list *preele;
- void *quiddity;
-}MESA_list_t;
-
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define MESA_LIST_VERSION_MACRO (20150529)
-extern const unsigned int MESA_LIST_VERSION_INT;
-
-void MESA_list_init_head(struct MESA_list *head);
-int MESA_list_is_empty(const struct MESA_list *head);
-void MESA_list_add(struct MESA_list *head, struct MESA_list *new_list);
-void MESA_list_add_tail(struct MESA_list *head, struct MESA_list *new_list);
-void MESA_list_del(struct MESA_list *head, struct MESA_list *del_list);
-void MESA_list_move(struct MESA_list *head, struct MESA_list *list);
-void MESA_list_move_tail(struct MESA_list *head, struct MESA_list *list);
-struct MESA_list *MESA_list_join_n(struct MESA_list *head, struct MESA_list *op_place, struct MESA_list *new_obj);
-struct MESA_list *MESA_list_join_p(struct MESA_list *head, struct MESA_list *new_obj, struct MESA_list *op_place);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/src/inc/MESA_list_count.h b/src/inc/MESA_list_count.h
deleted file mode 100644
index 884ee74..0000000
--- a/src/inc/MESA_list_count.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef _MESA_LIST_COUNT_H_
-#define _MESA_LIST_COUNT_H_
-
-typedef struct MESA_list_count{
- struct MESA_list_count *nextele;
- struct MESA_list_count *preele;
- void *quiddity;
-}MESA_list_count_t;
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-void MESA_list_count_init_head(struct MESA_list_count *head);
-long MESA_list_count_get_count(const struct MESA_list_count *head);
-int MESA_list_count_is_empty(const struct MESA_list_count *head);
-void MESA_list_count_add(struct MESA_list_count *head, struct MESA_list_count *new_list);
-void MESA_list_count_add_tail(struct MESA_list_count *head, struct MESA_list_count *new_list);
-void MESA_list_count_del(struct MESA_list_count *head, struct MESA_list_count *del_list);
-void MESA_list_count_move(struct MESA_list_count *head, struct MESA_list_count *list);
-void MESA_list_count_move_tail(struct MESA_list_count *head, struct MESA_list_count *list);
-struct MESA_list_count *MESA_list_count_join_n(struct MESA_list_count *head, struct MESA_list_count *op_place, struct MESA_list_count *new_obj);
-struct MESA_list_count *MESA_list_count_join_p(struct MESA_list_count *head, struct MESA_list_count *new_obj, struct MESA_list_count *op_place);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/src/inc/MESA_list_queue.h b/src/inc/MESA_list_queue.h
deleted file mode 100644
index 08ce32b..0000000
--- a/src/inc/MESA_list_queue.h
+++ /dev/null
@@ -1,115 +0,0 @@
-#ifndef _MESA_LIST_QUEUE_H_
-#define _MESA_LIST_QUEUE_H_
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/*
- MESA_list �����棬
- 1-�����̰߳�ȫ����;
- 2-�����ڲ��ṹ, ����ȫ���ӿڸ����;
- 3-�������������й����ڵ�ṹ��ʹ�ø�����;
-*/
-
-#define MESA_LIST_QUEUE_VERSION_MACRO (20160308)
-extern const unsigned int MESA_LIST_QUEUE_VERSION_INT;
-
-#define MESA_LIST_OP_PLACE_HEAD (0x1)
-#define MESA_LIST_OP_PLACE_TAIL (0x2)
-
-#define MESA_list_GET (0x1)
-#define MESA_list_JOIN (0x2)
-
-#define MESA_list_BOLCK (0x4)
-#define MESA_list_NONBOLCK (0x8)
-
-#define MESA_list_JOIN_BLOCK (MESA_list_JOIN|MESA_list_BOLCK)
-#define MESA_list_JOIN_NONBLOCK (MESA_list_JOIN|MESA_list_NONBOLCK)
-#define MESA_list_GET_BLOCK (MESA_list_GET|MESA_list_BOLCK)
-#define MESA_list_GET_NONBLOCK (MESA_list_GET|MESA_list_NONBOLCK)
-
-typedef void * MESA_lqueue_head;
-typedef int (* MESA_lqueue_cb_t)(void *data, long data_len, void *arg);
-
-/* All of the following functions return value */
-typedef enum{
- MESA_QUEUE_RET_OK = 0, /* success */
- MESA_QUEUE_RET_COMMON_ERR = -1, /* general��undefined errors */
- MESA_QUEUE_RET_ARG_ERR = -2, /* invalid args */
- MESA_QUEUE_RET_NUM_FULL = -3, /* queue number full */
- MESA_QUEUE_RET_MEM_FULL = -4, /* queue memory full */
- MESA_QUEUE_RET_QEMPTY = -5, /* queue empty */
- MESA_QUEUE_RET_LEN_ERR = -6, /* length error */
- MESA_QUEUE_RET_CANT_GET_LOCK = -7, /* can't get lock in non-block mode */
- MESA_QUEUE_RET_GET_LOCK_TMOUT = -8, /* get lock timeout */
-}MESA_queue_errno_t;
-
-/*
- args description:
- [IN]
- thread_safe : 1:create thread safe queue; 0:without thread safe insurance.
- max_item_num: maximum queue items of the queue, 0 means infinity.
-*/
-MESA_lqueue_head MESA_lqueue_create(int thread_safe, long max_item_num);
-
-/*
- attention:
- The follow two functions is get some value of queue in a moment,
- however, the value you got is not exactly,
- because it's maybe changed immediately by other thread when this functions is return.
-*/
-long MESA_lqueue_get_mem_used(MESA_lqueue_head head);
-long MESA_lqueue_get_count(MESA_lqueue_head head);
-
-
-/*
- args description:
- [IN]:
- lq_head : the handler of MESA_lqueue.
-
- [OUT]:
- data : receive buffer.
-
- [IN && OUT]:
- data_len:
- is value-result argument, like "addrlen of recvfrom(2)",
- the caller should initialize the size of the 'data',
- will modified on return to indicate the actual size of the queue item.
-
-*/
-int MESA_lqueue_read_head(MESA_lqueue_head lq_head, void *data, long *data_len);
-int MESA_lqueue_get_head(MESA_lqueue_head lqhead, void *data, long *data_len);
-
-/*
- if return value of "cb" is 0, the behaviour is like MESA_lqueue_read_head(),
- else if return value of "cb" is not 0, the behaviour is like MESA_lqueue_get_head().
-*/
-int MESA_lqueue_detect_get_head(MESA_lqueue_head lq_head, MESA_lqueue_cb_t cb, void *data, long *data_len, void *cb_arg);
-int MESA_lqueue_get_tail(MESA_lqueue_head lq_head, void *data, long *data_len);
-
-int MESA_lqueue_join_head(MESA_lqueue_head lq_head, const void *data, long data_len);
-int MESA_lqueue_join_tail(MESA_lqueue_head lq_head, const void *data, long data_len);
-
-
-/* these functions features same with above no "try",
- except shall return immediately, in other word is "Non-block mode"!
- */
-int MESA_lqueue_try_read_head(MESA_lqueue_head lq_head, void *data, long *data_len);
-int MESA_lqueue_try_get_head(MESA_lqueue_head lq_head, void *data, long *data_len);
-int MESA_lqueue_try_get_tail(MESA_lqueue_head lq_head, void *data, long *data_len);
-int MESA_lqueue_try_join_head(MESA_lqueue_head lq_head, const void *data, long data_len);
-int MESA_lqueue_try_join_tail(MESA_lqueue_head lq_head, const void *data, long data_len);
-
-
-void MESA_lqueue_destroy(MESA_lqueue_head head, MESA_lqueue_cb_t cb, void *cb_arg);
-
-const char *MESA_lqueue_strerror(MESA_queue_errno_t error_num);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/src/inc/MESA_prof_load.h b/src/inc/MESA_prof_load.h
deleted file mode 100644
index ecfc50f..0000000
--- a/src/inc/MESA_prof_load.h
+++ /dev/null
@@ -1,189 +0,0 @@
-#ifndef SLIB_LOADPROF_H
-#define SLIB_LOADPROF_H
-#include <sys/types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-// Read in specified integer value
-//
-// Return:
-// 0 : success
-// < 0 : error, val is set to default
-int MESA_load_profile_int_def(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- int *val, // [OUT] returned value
- const int dval); // [IN] default value
-
-
-
-// Read in specified integer value
-//
-// Return:
-// 0 : success
-// -1 : failed to get the key,may be have no thie section, key or the val which the key pointed error
-// -2 : error ,the val if out of range
-int MESA_load_profile_int_nodef(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- int *val); // [OUT] returned value
-
-
-
-
-// Read in specified unsigned integer value
-//
-// Return:
-// 0 : success
-// < 0 : error, val is set to default
-int MESA_load_profile_uint_def(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- unsigned int *val, // [OUT] returned value
- const unsigned int dval); // [IN] default value
-
-
-
-// Read in specified unsigned integer value
-//
-// Return:
-// 0 : success
-// -1 : failed to get the key,may be have no thie section, key or the val which the key pointed error
-// -2 : error ,the val if out of range
-int MESA_load_profile_uint_nodef(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- unsigned int *val); // [OUT] returned value
-
-
-
-// Read in specified short integer value
-//
-// Return:
-// 0 : success
-// < 0 : error, val is set to default
-int MESA_load_profile_short_def(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- short *val, // [OUT] returned value
- const short dval); // [IN] default value
-
-
-
-// Read in specified short integer value
-//
-// Return:
-// 0 : success
-// -1 : failed to get the key,may be have no thie section, key or the val which the key pointed error
-// -2 : error ,the val if out of range
-int MESA_load_profile_short_nodef(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- short *val); // [OUT] returned value
-
-
-
-// Read in specified string value,
-// if value string is too long to return, extra chars truncated.
-// prefix/postfix space chars cutted,
-// space chars: ' ', '\t' '\n' '\r'
-//
-// Return:
-// >= 0 : length of val
-// -1 : failed to get the key,may be have no thie section, key or the val which the key pointed error
-
-int MESA_load_profile_string_nodef(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- char *str, // [OUT] returned string
- const size_t size); // [IN] buffer size(bytes)
-
-
-
-// Read in specified string value,
-// if value string is too long to return, extra chars truncated.
-// prefix/postfix space chars cutted,
-// space chars: ' ', '\t' '\n' '\r'
-//
-// Return:
-// >= 0 : length of val
-// < 0 : error, str is set to default
-int MESA_load_profile_string_def(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- char *str, // [OUT] returned string
- const size_t size, // [IN] buffer size(bytes)
- const char *dstr); // [IN] default string
-
-//read muti unint number from config file, e.g "1-3,5-9"
-//return :
-// >=0 : success,return the number of uint read from file successfully
-// -1 : failed to get the key,may be have no thie section, key or the val which the key pointed error
-// -2 : error,invalid uint
-int MESA_load_profile_uint_range(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- const size_t size, // [IN] the number of unit memory out pointed
- unsigned int *out); // [OUT] return ipset network bytes order
-
-//read ips from config file
-//return :
-// >=0 : success,return the number of ip read from file successfully
-// -1 : failed to get the key,may be have no thie section, key or the val which the key pointed error
-// -2 : error,invalid ip
-
-#if 0
-int MESA_load_profile_ipset(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- const size_t size, // [IN] the size of memory ips point,it must equel or greater than ip_num*sizeof(unsigned int)
- unsigned int *ipset); // [OUT] return ipset network bytes order
-
-// Write the a int into specified position of the config file,the position is decided by section and key
-// Return:
-// >= 0 : success
-// -1 : failed to write profile,maybe fopen failed, or malloc failed
-int MESA_write_profile_int(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- const int value); // [IN] the integer need write
-
-// Write the a float into specified position of the config file,the position is decided by section and key
-// Return:
-// >= 0 : success
-// -1 : failed to write profile,maybe fopen failed, or malloc failed
-int MESA_write_profile_float(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- const float value); // [IN] the float need write
-
-// Write the a string into specified position of the config file,the position is decided by section and key
-// Return:
-// >= 0 : success
-// -1 : failed to write profile,maybe fopen failed, or malloc failed
-int MESA_write_profile_string(
- const char *file, // [IN] initialization file path
- const char *section, // [IN] section name in initialization file
- const char *key, // [IN] keyword name in initialization file
- const char *value); // [IN] the string need write
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* #ifndef SLIB_LOADPROF_H */
diff --git a/src/inc/MESA_ring_queue.h b/src/inc/MESA_ring_queue.h
deleted file mode 100644
index cc1efe8..0000000
--- a/src/inc/MESA_ring_queue.h
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef __MESA_RING_QUEUE_H_
-#define __MESA_RING_QUEUE_H_ 1
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-typedef void * MESA_ring_queue_head;
-
-#define MESA_RING_QUEUE_VERSION_MACRO (20160708)
-extern const unsigned int MESA_RING_QUEUE_VERSION_INT;
-
-/* All of the following functions return value */
-typedef enum{
- MESA_RQUEUE_RET_OK = 0, /* success */
- MESA_RQUEUE_RET_COMMON_ERR = -1, /* general��undefined errors */
- MESA_RQUEUE_RET_ARG_ERR = -2, /* invalid args */
- MESA_RQUEUE_RET_NUM_FULL = -3, /* queue number full */
- MESA_RQUEUE_RET_MEM_FULL = -4, /* queue memory full */
- MESA_RQUEUE_RET_QEMPTY = -5, /* queue empty */
- MESA_RQUEUE_RET_LEN_ERR = -6, /* length error */
- MESA_RQUEUE_RET_CANT_GET_LOCK = -7, /* can't get lock in non-block mode */
- MESA_RQUEUE_RET_GET_LOCK_TMOUT = -8, /* get lock timeout */
-}MESA_ring_queue_errno_t;
-
-
-/*
- args description:
- [IN]
- thread_safe : 1:create thread safe queue; 0:without thread safe insurance.
- max_item_num: maximum queue items of the queue, must more than zero.
-*/
-MESA_ring_queue_head MESA_ring_queue_born(void);
-
-
-enum MESA_rq_opt{
- RQO_THREAD_SAFE = 0, /* must be int, 1:create ring qqueue with thread safe features, default is 1 */
- RQO_RING_ELEMENT_NUM, /* must be unsigned int, defalut is 1000. */
- RQO_PRE_ALLOC_BUF_LEN, /* must be unsigned int, Ԥ�ȷ���ÿ��item���ڴ�, �Ժ�ֻ��memcpy */
- RQO_MULTI_THREAD_LOCK_FREE, /* must be int, default is 0, conflict with RQO_THREAD_SAFE */
-};
-
-/*
- to set features of specified MESA_ring_queue_headhandle.
- opt_type: option type, refer to enum MESA_htable_opt;
- opt_val : option value, depend on opt type;
- opt_len : opt_val size, depend on opt type;
-
- return value:
- 0 :success;
- <0:error;
-*/
-int MESA_ring_queue_set_opt(MESA_ring_queue_head rq, enum MESA_rq_opt opt_type, void *opt_val, int opt_len);
-
-
-/*
- Construct ring queue and ready to running.
-
- return value:
- 0 : success;
- <0: error.
-*/
-int MESA_ring_queue_mature(MESA_ring_queue_head rq);
-
-
-
-int MESA_ring_queue_get_count(MESA_ring_queue_head head);
-
-/*
- args description:
- [IN]:
- lq_head : the handler of MESA_ring_queue.
-
- [OUT]:
- data : receive buffer.
-
- [IN && OUT]:
- data_len:
- is value-result argument, like "addrlen of recvfrom(2)",
- the caller should initialize the size of the 'data',
- will modified on return to indicate the actual size of the queue item.
-
-*/
-int MESA_ring_queue_read(MESA_ring_queue_head rq_head, void *data, int *data_len);
-int MESA_ring_queue_get(MESA_ring_queue_head rqhead, void *data, int *data_len);
-int MESA_ring_queue_join(MESA_ring_queue_head rq_head, const void *data, int data_len);
-
-
-/* these functions features same with above no "try",
- except shall return immediately, in other word is "Non-block mode"!
- */
-int MESA_ring_queue_try_read(MESA_ring_queue_head rq_head, void *data, int *data_len);
-int MESA_ring_queue_try_get(MESA_ring_queue_head rqhead, void *data, int *data_len);
-int MESA_ring_queue_try_join(MESA_ring_queue_head rq_head, const void *data, int data_len);
-
-
-typedef int (* MESA_rqueue_cb_t)(void *data, long data_len, void *arg);
-void MESA_ring_queue_destroy(MESA_ring_queue_head rq_head, MESA_rqueue_cb_t cb, void *cb_arg);
-const char *MESA_ring_queue_strerror(MESA_ring_queue_errno_t error_num);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/src/inc/Maat_command.h b/src/inc/Maat_command.h
deleted file mode 100644
index ec4796f..0000000
--- a/src/inc/Maat_command.h
+++ /dev/null
@@ -1,167 +0,0 @@
-#ifndef H_MAAT_COMMAND_H_INCLUDE
-#define H_MAAT_COMMAND_H_INCLUDE
-#ifndef __cplusplus
-#error("This file should be compiled with C++ compiler")
-#endif
-#include "Maat_rule.h"
-enum MAAT_OPERATION
-{
- MAAT_OP_DEL=0,
- MAAT_OP_ADD,
- MAAT_OP_RENEW_TIMEOUT //Rule expire time is changed to now+cmd->expire_after
-};
-
-enum MAAT_REGION_TYPE
-{
- REGION_EXPR,
- REGION_IP,
- REGION_INTERVAL,
- REGION_DIGEST,
- REGION_SIMILARITY
-};
-enum MAAT_EXPR_TYPE
-{
- EXPR_TYPE_STRING=0,
- EXPR_TYPE_AND,
- EXPR_TYPE_REGEX,
- EXPR_TYPE_OFFSET
-};
-enum MAAT_MATCH_METHOD
-{
- MATCH_METHOD_SUB=0,
- MATCH_METHOD_RIGHT,
- MATCH_METHOD_LEFT,
- MATCH_METHOD_COMPLETE
-};
-
-enum MAAT_CASE_TYPE
-{
- UNCASE_PLAIN=0,
- CASE_HEXBIN,
- CASE_PLAIN
-};
-enum MAAT_ADDR_TYPE
-{
- ADDR_TYPE_IPv4=4,
- ADDR_TYPE_IPv6=6
-};
-enum MAAT_ADDR_DIRECTION
-{
- ADDR_DIR_DOUBLE=0,
- ADDR_DIR_SINGLE=1
-};
-struct Maat_rgn_str_t
-{
- const char *keywords;
- const char *district;// optional for expr_plus, otherwise set to NULL.
- enum MAAT_EXPR_TYPE expr_type;
- enum MAAT_MATCH_METHOD match_method;
- enum MAAT_CASE_TYPE hex_bin;
-};
-struct Maat_rgn_addr_t
-{
- enum MAAT_ADDR_TYPE addr_type;
- const char* src_ip;
- const char* mask_src_ip;
- const char* dst_ip;
- const char* mask_dst_ip;
- unsigned short src_port;
- unsigned short mask_src_port;
- unsigned short dst_port;
- unsigned short mask_dst_port;
- unsigned short protocol;
- enum MAAT_ADDR_DIRECTION direction;
-};
-struct Maat_rgn_intv_t
-{
- unsigned int low_boundary;
- unsigned int up_boundary;
-};
-struct Maat_rgn_digest_t
-{
- unsigned long long orgin_len;
- const char* digest_string;
- short confidence_degree;
-};
-struct Maat_rgn_sim_t
-{
- char* target;
- short threshold;// 1~100
-};
-struct Maat_region_t
-{
- const char* table_name;
- int region_id; //If MAAT_OPT_CMD_AUTO_NUMBERING==1, maat will assigned one. Or users must appoint a unique number.
- enum MAAT_REGION_TYPE region_type;
- union
- {
- struct Maat_rgn_str_t expr_rule;
- struct Maat_rgn_addr_t ip_rule;
- struct Maat_rgn_intv_t interval_rule;
- struct Maat_rgn_digest_t digest_rule;
- struct Maat_rgn_sim_t similarity_rule;
- };
-};
-struct Maat_group_t
-{
- int region_num;
- int group_id; //If MAAT_OPT_CMD_AUTO_NUMBERING==1, maat will assigned one. Or users must assign a unique number.
- struct Maat_region_t *regions;
-};
-struct Maat_cmd_t
-{
- //This Struct MUST alloced by Maat_create_cmd(), then released by Maat_free_cmd().
- struct Maat_rule_t compile; // for MAAT_OP_DEL, only compile.config_id is necessary.
- int group_num; // for MAAT_OP_DEL, set to 0.
- int expire_after; //expired after $expire_after$ seconds, set to 0 for never timeout.
- int label_id; //>0, to be indexed and quried by Maat_cmd_select; =0 not index
- struct Maat_group_t* groups;// Add regions with Maat_add_region2cmd
-};
-struct Maat_line_t
-{
- const char* table_name;
- const char* table_line;
- int rule_id; // for MAAT_OP_DEL, only rule_id and table_name are necessary.
- int label_id;
- int expire_after; //expired after $timeout$ seconds, set to 0 for never timeout.
-};
-struct Maat_cmd_t* Maat_create_cmd(const struct Maat_rule_t* rule, int group_num);
-int Maat_cmd_set_opt(struct Maat_cmd_t* cmd, enum MAAT_RULE_OPT type, const char* val, int size);
-//input: which_group 0~group_num
-//input: region can be freed after added.
-void Maat_add_region2cmd(struct Maat_cmd_t* cmd,int which_group,const struct Maat_region_t* region);
-
-void Maat_free_cmd(struct Maat_cmd_t* cmd);
-int Maat_format_cmd(struct Maat_cmd_t* cmd, char* buffer, int size);
-//Input string of REGION_EXPR and REGION_SIMILARITY need to be escapeed.
-char* Maat_str_escape(char* dst,int size,const char*src);
-
-//Deletion failed due to not complete synchronize with Redis.
-//To make sure the delete command is excecuted, user should try again after MAAT_OPT_SCANDIR_INTERVAL_MS ms.
-//Returns nubmer of successfully updated rule.
-//The following functions are NOT thread safe.
-int Maat_cmd(Maat_feather_t feather,struct Maat_cmd_t* cmd,enum MAAT_OPERATION op);
-
-//pipeline model
-int Maat_cmd_append(Maat_feather_t feather,struct Maat_cmd_t* cmd,enum MAAT_OPERATION op);
-
-//Return nubmer of successfully updated rule.
-//Return -1 for failed.
-int Maat_cmd_commit(Maat_feather_t feather);
-
-
-int Maat_cmd_set_group(Maat_feather_t feather, int group_id, const struct Maat_region_t* region, enum MAAT_OPERATION op);
-
-//Returns nubmer of successfully updated rule.
-//Return -1 for failed.
-int Maat_cmd_set_line(Maat_feather_t feather,const struct Maat_line_t* line_rule, enum MAAT_OPERATION op);
-int Maat_cmd_set_lines(Maat_feather_t feather,const struct Maat_line_t** line_rule, int line_num ,enum MAAT_OPERATION op);
-int Maat_cmd_set_file(Maat_feather_t feather,const char* key, const char* value, size_t size, enum MAAT_OPERATION op);
-
-//Return the value of key after the increment.
-//If the key does not exist, it is set to 0 before performing the operation.
-long long Maat_cmd_incrby(Maat_feather_t feather,const char* key, int increment);
-int Maat_cmd_select(Maat_feather_t feather, int label_id, int * output_ids, unsigned int size);
-int Maat_cmd_flushDB(Maat_feather_t feather);
-#endif
-
diff --git a/src/inc/Maat_rule.h b/src/inc/Maat_rule.h
deleted file mode 100644
index afba44c..0000000
--- a/src/inc/Maat_rule.h
+++ /dev/null
@@ -1,289 +0,0 @@
-
-/*
-*****************Maat Deep Packet Inspection Policy Framework********
-* Maat is the Goddess of truth and justice in ancient Egyptian concept.
-* Her feather was the measure that determined whether the souls (considered
-* to reside in the heart) of the departed would reach the paradise of afterlife
-* successfully.
-* Author: [email protected], MESA
-* Version 2018-12-07 Plugin Extra Data.
-* NOTE: MUST compile with G++
-* All right reserved by Institute of Infomation Engineering,Chinese Academic of Science 2014~2018
-*********************************************************
-*/
-#ifndef H_MAAT_RULE_H_INCLUDE
-#define H_MAAT_RULE_H_INCLUDE
-#ifndef __cplusplus
-#error("This file should be compiled with C++ compiler")
-#endif
-#include <MESA/stream.h>
-enum MAAT_CHARSET
-{
- CHARSET_NONE=0,
- CHARSET_GBK,
- CHARSET_BIG5,
- CHARSET_UNICODE,
- CHARSET_UTF8, // 4
- CHARSET_BIN, //5
- CHARSET_UNICODE_ASCII_ESC, // Unicode Escape format, prefix backslash-u hex, e.g. "\u627;"
- CHARSET_UNICODE_ASCII_ALIGNED,//Unicode Escape format, prefix backslash-u with 4 bytes aligned, e.g. "\u0627"
- CHARSET_UNICODE_NCR_DEC, //SGML Numeric character reference,decimal base, e.g. "&#1575;"
- CHARSET_UNICODE_NCR_HEX, //SGML Numeric character reference,hexdecimal base, e.g. "&#x627;"
- CHARSET_URL_ENCODE_GB2312, //URL encode with GB2312, e.g. the chinese word "china" was encoded to %D6%D0%B9%FA
- CHARSET_URL_ENCODE_UTF8 //11, URL encode with UTF8,e.g. the chinese word "china" was encoded to %E4%B8%AD%E5%9B%BD
-};
-enum MAAT_ACTION
-{
- MAAT_ACTION_BLOCK=0,
- MAAT_ACTION_MONIT,
- MAAT_ACTION_WHITE
-};
-enum MAAT_POS_TYPE
-{
- MAAT_POSTYPE_EXPR=0,
- MAAT_POSTYPE_REGEX
-};
-typedef void* scan_status_t;
-typedef void* stream_para_t;
-typedef void* Maat_feather_t;
-
-
-#define MAX_SERVICE_DEFINE_LEN 128
-#define MAX_HUGE_SERVICE_DEFINE_LEN (1024*4)
-struct Maat_rule_t
-{
- int config_id;
- int service_id;
- char do_log;
- char do_blacklist;
- char action;
- char reserved;
- int serv_def_len;
- char service_defined[MAX_SERVICE_DEFINE_LEN];
-};
-#define MAAT_RULE_UPDATE_TYPE_FULL 1
-#define MAAT_RULE_UPDATE_TYPE_INC 2
-typedef void Maat_start_callback_t(int update_type,void* u_para);
-typedef void Maat_update_callback_t(int table_id,const char* table_line,void* u_para);
-typedef void Maat_finish_callback_t(void* u_para);
-
-
-
-
-
-//--------------------HITTING DETAIL DESCRIPTION BEGIN
-
-#define MAAT_MAX_HIT_RULE_NUM 8
-#define MAAT_MAX_EXPR_ITEM_NUM 8
-#define MAAT_MAX_HIT_POS_NUM 8
-#define MAAT_MAX_REGEX_GROUP_NUM 8
-
-//NOTE position buffer as hitting_regex_pos and hit_pos,are ONLY valid before next scan or Maat_stream_scan_string_end
-struct regex_pos_t
-{
- int group_num;
- int hitting_regex_len;
- const char* hitting_regex_pos;
- int grouping_len[MAAT_MAX_REGEX_GROUP_NUM];
- const char* grouping_pos[MAAT_MAX_REGEX_GROUP_NUM];
-};
-struct str_pos_t
-{
- int hit_len;
- const char* hit_pos;
-};
-struct sub_item_pos_t
-{
- enum MAAT_POS_TYPE ruletype;
- int hit_cnt;
- union
- {
- struct regex_pos_t regex_pos[MAAT_MAX_HIT_POS_NUM];
- struct str_pos_t substr_pos[MAAT_MAX_HIT_POS_NUM];
- };
-};
-
-struct Maat_region_pos_t
-{
-
- int region_id;
- int sub_item_num;
- struct sub_item_pos_t sub_item_pos[MAAT_MAX_EXPR_ITEM_NUM];
-};
-
-struct Maat_hit_detail_t
-{
- int config_id;//set <0 if half hit;
- int hit_region_cnt;
- struct Maat_region_pos_t region_pos[MAAT_MAX_HIT_RULE_NUM];
-};
-//--------------------HITTING DETAIL DESCRIPTION END
-
-//Abondon interface ,left for compatible.
-Maat_feather_t Maat_summon_feather(int max_thread_num,
- const char* table_info_path,
- const char* ful_cfg_dir,
- const char* inc_cfg_dir,
- void*logger);//MESA_handle_logger
-//Abondon interface ,left for compatible.
-Maat_feather_t Maat_summon_feather_json(int max_thread_num,
- const char* table_info_path,
- const char* json_rule,
- void* logger);
-
-Maat_feather_t Maat_feather(int max_thread_num,const char* table_info_path,void* logger);
-int Maat_initiate_feather(Maat_feather_t feather);
-
-enum MAAT_INIT_OPT
-{
- MAAT_OPT_SCANDIR_INTERVAL_MS=1, //VALUE is interger, SIZE=sizeof(int). DEFAULT:1,000 milliseconds.
- MAAT_OPT_EFFECT_INVERVAL_MS, //VALUE is interger, SIZE=sizeof(int). DEFAULT:60,000 milliseconds.
- MAAT_OPT_FULL_CFG_DIR, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1.DEFAULT: no default.
- MAAT_OPT_INC_CFG_DIR, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1.DEFAULT: no default.
- MAAT_OPT_JSON_FILE_PATH, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1.DEFAULT: no default.
- MAAT_OPT_STAT_ON, //VALUE is NULL, SIZE is 0. MAAT_OPT_STAT_FILE_PATH must be set. Default: stat OFF.
- MAAT_OPT_PERF_ON, //VALUE is NULL, SIZE is 0. MAAT_OPT_STAT_FILE_PATH must be set. Default: stat OFF.
- MAAT_OPT_STAT_FILE_PATH, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. DEFAULT: no default.
- MAAT_OPT_SCAN_DETAIL, //VALUE is interger *, SIZE=sizeof(int). 0: not return any detail;1: return hit pos, not include regex grouping.
- // 2 return hit pos and regex grouping pos;DEFAULT:0
- MAAT_OPT_INSTANCE_NAME, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1, no more than 11 bytes.DEFAULT: MAAT_$tableinfo_path$.
- MAAT_OPT_DECRYPT_KEY, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. No DEFAULT.
- MAAT_OPT_REDIS_IP, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. No DEFAULT.
- MAAT_OPT_REDIS_PORT, //VALUE is a unsigned short or a signed int, host order, SIZE= sizeof(unsigned short) or sizeof(int). No DEFAULT.
- MAAT_OPT_REDIS_INDEX, //VALUE is interger *, 0~15, SIZE=sizeof(int). DEFAULT: 0.
- MAAT_OPT_CMD_AUTO_NUMBERING, //VALUE is a interger *, 1 or 0, SIZE=sizeof(int). DEFAULT: 1.
- MAAT_OPT_DEFERRED_LOAD, //VALUE is NULL,SIZE is 0. Default: Deffered initialization OFF.
- MAAT_OPT_CUMULATIVE_UPDATE_OFF, //VALUE is NULL,SIZE is 0. Default: CUMMULATIVE UPDATE ON.
- MAAT_OPT_LOAD_VERSION_FROM, //VALUE is a long long, SIZE=sizeof(long long). Default: Load the Latest. Only valid in redis mode, and maybe failed for too old.
- //This option also disables background update.
- MAAT_OPT_ENABLE_UPDATE, //VALUE is interger, SIZE=sizeof(int). 1: Enabled, 0:Disabled. DEFAULT: Backgroud update is enabled. Runtime setting is allowed.
- MAAT_OPT_ACCEPT_TAGS, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. Format is a JSON, e.g.{"tags":[{"tag":"location","value":"Beijing/ChaoYang/Huayan/22A"},{"tag":"isp","value":"telecom"}]}
- MAAT_OPT_FOREIGN_CONT_DIR, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. Specifies a local diretory to store foreign content. Default: []table_info_path]_files
- MAAT_OPT_FOREIGN_CONT_LINGER //VALUE is interger *, SIZE=sizeof(int). Greater than 0: delete after VALUE seconds; 0: delete foreign content right after the notification callbacks; Less than 0: NEVER delete. Default: 0.
-};
-//return -1 if failed, return 0 on success;
-int Maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const void* value,int size);
-enum MAAT_STATE_OPT
-{
- MAAT_STATE_VERSION=1, //Get current maat version, if maat is in update progress, the updating version is returned. VALUE is long long, SIZE=sizeof(long long).
- MAAT_STATE_LAST_UPDATING_TABLE, //Query at Maat_finish_callback_t to determine whether this table is the last one to update. VALUE is interger, SIZE=sizeof(int), 1:yes, 0: no
- MAAT_STATE_IN_UPDATING
-};
-int Maat_read_state(Maat_feather_t feather, enum MAAT_STATE_OPT type, void* value, int size);
-
-void Maat_burn_feather(Maat_feather_t feather);
-
-//return table_id(>=0) if success,otherwise return -1;
-int Maat_table_register(Maat_feather_t feather,const char* table_name);
-//return 1 if success,otherwise return -1 incase invalid table_id or registed function number exceed 32;
-int Maat_table_callback_register(Maat_feather_t feather,short table_id,
- Maat_start_callback_t *start,//MAAT_RULE_UPDATE_TYPE_*,u_para
- Maat_update_callback_t *update,//table line ,u_para
- Maat_finish_callback_t *finish,//u_para
- void* u_para);
-
-
-enum MAAT_SCAN_OPT
-{
- MAAT_SET_SCAN_DISTRICT=1, //VALUE is a const char*,SIZE= strlen(string).DEFAULT: no default.
- MAAT_SET_SCAN_LAST_REGION //VALUE is NULL, SIZE=0. This option indicates that the follow scan is the last region of current scan cobination.
-};
-//return 0 if success, return -1 when failed;
-int Maat_set_scan_status(Maat_feather_t feather,scan_status_t* mid,enum MAAT_SCAN_OPT type,const void* value,int size);
-
-//Return hit rule number, return -1 when error occurs,return -2 when hit current region
-//mid MUST set to NULL before fist call
-int Maat_scan_intval(Maat_feather_t feather,int table_id
- ,unsigned int intval
- ,struct Maat_rule_t*result,int rule_num
- ,scan_status_t *mid,int thread_num);
-int Maat_scan_addr(Maat_feather_t feather,int table_id
- ,struct ipaddr* addr
- ,struct Maat_rule_t*result,int rule_num
- ,scan_status_t *mid,int thread_num);
-int Maat_scan_proto_addr(Maat_feather_t feather,int table_id
- ,struct ipaddr* addr,unsigned short int proto
- ,struct Maat_rule_t*result,int rule_num
- ,scan_status_t *mid,int thread_num);
-int Maat_full_scan_string(Maat_feather_t feather,int table_id
- ,enum MAAT_CHARSET charset,const char* data,int data_len
- ,struct Maat_rule_t*result,int* found_pos,int rule_num
- ,scan_status_t* mid,int thread_num);
-//hite_detail could be NULL if unconcern
-int Maat_full_scan_string_detail(Maat_feather_t feather,int table_id
- ,enum MAAT_CHARSET charset,const char* data,int data_len
- ,struct Maat_rule_t*result,int rule_num,struct Maat_hit_detail_t *hit_detail,int detail_num
- ,int* detail_ret,scan_status_t* mid,int thread_num);
-
-stream_para_t Maat_stream_scan_string_start(Maat_feather_t feather,int table_id,int thread_num);
-int Maat_stream_scan_string(stream_para_t* stream_para
- ,enum MAAT_CHARSET charset,const char* data,int data_len
- ,struct Maat_rule_t*result,int* found_pos,int rule_num
- ,scan_status_t* mid);
-//hited_detail could be NULL if unconcern
-int Maat_stream_scan_string_detail(stream_para_t* stream_para
- ,enum MAAT_CHARSET charset,const char* data,int data_len
- ,struct Maat_rule_t*result,int rule_num,struct Maat_hit_detail_t *hit_detail,int detail_num
- ,int* detail_ret,scan_status_t* mid);
-void Maat_stream_scan_string_end(stream_para_t* stream_para);
-
-stream_para_t Maat_stream_scan_digest_start(Maat_feather_t feather,int table_id,unsigned long long total_len,int thread_num);
-int Maat_stream_scan_digest(stream_para_t* stream_para
- ,const char* data,int data_len,unsigned long long offset
- ,struct Maat_rule_t*result,int rule_num
- ,scan_status_t* mid);
-void Maat_stream_scan_digest_end(stream_para_t* stream_para);
-
-int Maat_similar_scan_string(Maat_feather_t feather,int table_id
- ,const char* data,int data_len
- ,struct Maat_rule_t*result,int rule_num
- ,scan_status_t* mid,int thread_num);
-
-void Maat_clean_status(scan_status_t* mid);
-
-typedef void* MAAT_RULE_EX_DATA;
-// The idx parameter is the index: this will be the same value returned by Maat_rule_get_ex_new_index() when the functions were initially registered.
-// Finally the argl and argp parameters are the values originally passed to the same corresponding parameters when Maat_rule_get_ex_new_index() was called.
-typedef void Maat_rule_EX_new_func_t(int idx, const struct Maat_rule_t* rule, const char* srv_def_large,
- MAAT_RULE_EX_DATA* ad, long argl, void *argp);
-typedef void Maat_rule_EX_free_func_t(int idx, const struct Maat_rule_t* rule, const char* srv_def_large,
- MAAT_RULE_EX_DATA* ad, long argl, void *argp);
-typedef void Maat_rule_EX_dup_func_t(int idx, MAAT_RULE_EX_DATA *to, MAAT_RULE_EX_DATA *from, long argl, void *argp);
-
-int Maat_rule_get_ex_new_index(Maat_feather_t feather, const char* compile_table_name,
- Maat_rule_EX_new_func_t* new_func,
- Maat_rule_EX_free_func_t* free_func,
- Maat_rule_EX_dup_func_t* dup_func,
- long argl, void *argp);
-//returned data is duplicated by dup_func of Maat_rule_get_ex_new_index, caller is responsible to free the data.
-MAAT_RULE_EX_DATA Maat_rule_get_ex_data(Maat_feather_t feather, const struct Maat_rule_t* rule, int idx);
-
-//Helper function for parsing space or tab seperated line.
-//Nth_column: the Nth column is numberd from 1.
-//Return 0 if success.
-int Maat_helper_read_column(const char* line, int Nth_column, size_t *column_offset, size_t *column_len);
-
-
-//Following functions are similar to Maat_rule_get_ex_data, except they are effective on plugin table.
-typedef void* MAAT_PLUGIN_EX_DATA;
-typedef void Maat_plugin_EX_new_func_t(int table_id, const char* key, const char* table_line, MAAT_PLUGIN_EX_DATA* ad, long argl, void *argp);
-typedef void Maat_plugin_EX_free_func_t(int table_id, MAAT_PLUGIN_EX_DATA* ad, long argl, void *argp);
-typedef void Maat_plugin_EX_dup_func_t(int table_id, MAAT_PLUGIN_EX_DATA *to, MAAT_PLUGIN_EX_DATA *from, long argl, void *argp);
-typedef int Maat_plugin_EX_key2index_func_t(const char* key);
-
-int Maat_plugin_EX_register(Maat_feather_t feather, int table_id,
- Maat_plugin_EX_new_func_t* new_func,
- Maat_plugin_EX_free_func_t* free_func,
- Maat_plugin_EX_dup_func_t* dup_func,
- Maat_plugin_EX_key2index_func_t* key2index_func,
- long argl, void *argp);
-//Data is duplicated by dup_func of Maat_plugin_EX_register, caller is responsible to free the data.
-MAAT_PLUGIN_EX_DATA Maat_plugin_get_EX_data(Maat_feather_t feather, int table_id, const char* key);
-
-enum MAAT_RULE_OPT
-{
- MAAT_RULE_SERV_DEFINE //VALUE is a char* buffer,SIZE= buffer size.
-};
-int Maat_read_rule(Maat_feather_t feather, const struct Maat_rule_t* rule, enum MAAT_RULE_OPT type, void* value, int size);
-#endif // H_MAAT_RULE_H_INCLUDE
-
diff --git a/src/inc/field_stat2.h b/src/inc/field_stat2.h
deleted file mode 100644
index 6ed212c..0000000
--- a/src/inc/field_stat2.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef H_SCREEN_STAT_H_INCLUDE
-#define H_SCREEN_STAT_H_INCLUDE
-#include <stdio.h>
-
-#ifndef __cplusplus
-#error("This file should be compiled with C++ compiler")
-#endif
-
-enum field_dsp_style_t
-{
- FS_STYLE_FIELD=0,
- FS_STYLE_COLUMN,
- FS_STYLE_LINE,
- FS_STYLE_STATUS
-};
-enum field_calc_algo
-{
- FS_CALC_CURRENT=0,
- FS_CALC_SPEED
-};
-enum field_op
-{
- FS_OP_ADD=1,
- FS_OP_SET,
-};
-
-
-typedef void* screen_stat_handle_t;
-
-enum FS_option
-{
- OUTPUT_DEVICE, //VALUE is a const char*, indicate a file path string, SIZE = strlen(string+'\0')+1.DEFAULT:output to stdout.
- PRINT_MODE, //VALUE is an interger,1:Rewrite ,2: Append. SIZE=4,DEFALUT:REWRITE.
- STAT_CYCLE, //VALUE is an interger idicate interval seconds of every output, SIZE=4 ,DEFUALT:2 seconds.
- PRINT_TRIGGER, //VALUE is an interger,1:Do print,0: Don't print.SIZE=4.DEFAULT:1.
- CREATE_THREAD, //VALUE is an interger,1: Create a print thread,0:not create,output by call passive_output function,
- //and the STAT_CYCLE is meaningless.SIZE=4,DEFAULT:0.
- ID_INVISBLE, //value is field_id/status_id/column_id, not output this string, SIZE=4,DEFAULT: shutdown NO one.
- FLUSH_BY_DATE, //value is 1(ture) or 0(false),SIZE=4,DEFAULT: Do not flush by date.
- APP_NAME, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. DEFAULT is "?".
- STATS_SERVER_IP, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. No DEFAULT.
- STATS_SERVER_PORT, //VALUE is a unsigned short or a signed int, host order, SIZE= sizeof(unsigned short) or sizeof(int). No DEFAULT.
- MAX_STAT_FIELD_NUM //VALUE is an interger, SIZE=sizeof(int), DEFAULT:1024.
-};
-
-//Always success.
-screen_stat_handle_t FS_create_handle(void);
-
-int FS_set_para(screen_stat_handle_t handle, enum FS_option type,const void* value,int size);
-void FS_start(screen_stat_handle_t handle);
-void FS_stop(screen_stat_handle_t* handle);
-
-//return field_id/line_id/column_id greater than zero if success,return an interger less than zero if failed.
-//should NOT include "|:\n\r.\t<>[]#!@"or space in the parameter name.
-//Runtime rregister column is NOT allowed.
-int FS_register(screen_stat_handle_t handle,enum field_dsp_style_t style,enum field_calc_algo calc_type,const char* name);
-
-//numerator_id and denominator_id must be column/field/status style.
-//scaling: negative value: zoom in; positive value: zoom out;
-int FS_register_ratio(screen_stat_handle_t handle,int numerator_id,int denominator_id,int scaling,enum field_dsp_style_t style,enum field_calc_algo calc_type,const char* name);
-
-//id: when id's type is FIELD , column_id is ignore.
-int FS_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op,long long value);
-
-void FS_passive_output(screen_stat_handle_t handle);
-
-#endif
-
diff --git a/src/inc/gram_index_engine.h b/src/inc/gram_index_engine.h
deleted file mode 100644
index a69e924..0000000
--- a/src/inc/gram_index_engine.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef _GRAM_INDEX_ENGINE_
-#define _GRAM_INDEX_ENGINE_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define GIE_INSERT_OPT 0
-#define GIE_DELETE_OPT 1
-#define GIE_INPUT_FORMAT_SFH 1
-#define GIE_INPUT_FORMAT_PLAIN 0
-
-
-typedef struct
-{
- /* data */
-}GIE_handle_t;
-
-
-typedef struct
-{
- unsigned int id;
- unsigned int sfh_length;//size of fuzzy_hash
- short operation;//GIE_INSERT_OPT or GIE_DELETE_OPT.if operation is GIE_DELETE_OPT, only id is needed;
- short cfds_lvl;
- char * sfh;
- void * tag;
-}GIE_digest_t;
-
-
-typedef struct
-{
- unsigned int id;
- short cfds_lvl;
- void * tag;
-}GIE_result_t;
-
-
-typedef struct
-{
- unsigned int gram_value;
- //unsigned int htable_num;
- unsigned int position_accuracy;
- short format; //if format==GIE_INPUT_FORMAT_SFH, means the input string is a GIE_INPUT_FORMAT_SFH string
- //else id format==PALIN, means the input string is common string
- short ED_reexamine;//if ED_reexamine==1, calculate edit distance to verify the final result
-}GIE_create_para_t;
-
-
-GIE_handle_t * GIE_create(const GIE_create_para_t * para);
-
-
-int GIE_update(GIE_handle_t * handle, GIE_digest_t ** digests, int size);
-
-
-//return actual matched result count
-//return 0 when matched nothing;
-//return -1 when error occurs;
-int GIE_query(GIE_handle_t * handle, const char * data, int data_len, GIE_result_t * results, int result_size);
-
-void GIE_destory(GIE_handle_t * handle);
-int GIE_string_similiarity(const char *str1, int len1, const char *str2, int len2);
-int GIE_sfh_similiarity(const char *sfh1, int len1, const char *sfh2, int len2);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/src/inc/inc.mk b/src/inc/inc.mk
deleted file mode 100644
index b4119d5..0000000
--- a/src/inc/inc.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-# standard component Makefile header
-sp := $(sp).x
-dirstack_$(sp) := $(d)
-d := $(dir)
-
-# component specification
-
-OBJS_$(d) :=\
- $(OBJ_DIR_CPP)/moodycamel_field_stat2.o\
- $(OBJ_DIR_CPP)/moodycamel_maat_rule.o
-
-
-CFLAGS_LOCAL += -I$(d)
-$(OBJS_$(d)): CFLAGS_LOCAL := -std=c++11 -W -Wall -g -O3\
- -I$(d)\
-
-# standard component Makefile rules
-
-DEPS_$(d) := $(OBJS_$(d):.o=.d)
-
-CLEAN_LIST := $(CLEAN_LIST) $(OBJS_$(d)) $(DEPS_$(d))
-
-$(OBJ_DIR_CPP)/%.o: $(d)/%.cpp
- $(CPPCOMPILE)
-
--include $(DEPS_$(d))
-
-# standard component Makefile footer
-
-d := $(dirstack_$(sp))
-sp := $(basename $(sp))
diff --git a/src/inc/moodycamel_field_stat2.cpp b/src/inc/moodycamel_field_stat2.cpp
deleted file mode 100644
index 4e56fe1..0000000
--- a/src/inc/moodycamel_field_stat2.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*************************************************************************
- > File Name: moodycamel_field_stat2.cpp
- > Author:
- > Mail:
- > Created Time: 2018年07月03日 星期二 16时48分52秒
- ************************************************************************/
-
-#include<iostream>
-#include "field_stat2.h"
-
-using namespace std;
-
-extern "C" screen_stat_handle_t FS_internal_create_handle(void);
-extern "C" int FS_internal_set_para(screen_stat_handle_t handle, enum FS_option type,const void* value,int size);
-extern "C" void FS_internal_start(screen_stat_handle_t handle);
-extern "C" void FS_internal_stop(screen_stat_handle_t* handle);
-extern "C" int FS_internal_register(screen_stat_handle_t handle,enum field_dsp_style_t style,
- enum field_calc_algo calc_type,const char* name);
-extern "C" int FS_internal_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op,long long value);
-
-extern "C" int FS_internal_register_ratio(screen_stat_handle_t handle,int numerator_id,int denominator_id,int scaling,
- enum field_dsp_style_t style,enum field_calc_algo calc_type,const char* name);
-
-screen_stat_handle_t FS_internal_create_handle(void)
-{
- return FS_create_handle();
-}
-
-int FS_internal_set_para(screen_stat_handle_t handle, enum FS_option type,const void* value,int size)
-{
- return FS_set_para(handle, type, value, size);
-}
-
-void FS_internal_start(screen_stat_handle_t handle)
-{
- FS_start(handle);
-}
-
-void FS_internal_stop(screen_stat_handle_t* handle)
-{
- FS_stop(handle);
-}
-
-int FS_internal_register(screen_stat_handle_t handle,enum field_dsp_style_t style,
- enum field_calc_algo calc_type,const char* name)
-{
- return FS_register(handle, style, calc_type, name);
-}
-
-int FS_internal_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op,long long value)
-{
- return FS_operate(handle, id, column_id, op, value);
-}
-
-int FS_internal_register_ratio(screen_stat_handle_t handle,int numerator_id,int denominator_id,int scaling,
- enum field_dsp_style_t style,enum field_calc_algo calc_type,const char* name)
-{
- return FS_register_ratio(handle, numerator_id, denominator_id, scaling, style, calc_type, name);
-}
-
diff --git a/src/inc/moodycamel_field_stat2.h b/src/inc/moodycamel_field_stat2.h
deleted file mode 100644
index a5e9a2c..0000000
--- a/src/inc/moodycamel_field_stat2.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*************************************************************************
- > File Name: moodycamel_field_stat2.h
- > Author:
- > Mail:
- > Created Time: 2018年07月03日 星期二 16时51分41秒
- ************************************************************************/
-
-#ifndef _MOODYCAMEL_FIELD_STAT2_H
-#define _MOODYCAMEL_FIELD_STAT2_H
-
-enum field_dsp_style_t
-{
- FS_STYLE_FIELD=0,
- FS_STYLE_COLUMN,
- FS_STYLE_LINE,
- FS_STYLE_STATUS
-};
-enum field_calc_algo
-{
- FS_CALC_CURRENT=0,
- FS_CALC_SPEED
-};
-enum field_op
-{
- FS_OP_ADD=1,
- FS_OP_SET,
-};
-
-typedef void* screen_stat_handle_t;
-
-enum FS_option
-{
- OUTPUT_DEVICE, //VALUE is a const char*, indicate a file path string, SIZE = strlen(string+'\0')+1.DEFAULT:output to stdout.
- PRINT_MODE, //VALUE is an interger,1:Rewrite ,2: Append. SIZE=4,DEFALUT:REWRITE.
- STAT_CYCLE, //VALUE is an interger idicate interval seconds of every output, SIZE=4 ,DEFUALT:2 seconds.
- PRINT_TRIGGER, //VALUE is an interger,1:Do print,0: Don't print.SIZE=4.DEFAULT:1.
- CREATE_THREAD, //VALUE is an interger,1: Create a print thread,0:not create,output by call passive_output function,
- //and the STAT_CYCLE is meaningless.SIZE=4,DEFAULT:0.
- ID_INVISBLE, //value is field_id/status_id/column_id, not output this string, SIZE=4,DEFAULT: shutdown NO one.
- FLUSH_BY_DATE, //value is 1(ture) or 0(false),SIZE=4,DEFAULT: Do not flush by date.
- APP_NAME, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. DEFAULT is "?".
- STATS_SERVER_IP, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. No DEFAULT.
- STATS_SERVER_PORT, //VALUE is a unsigned short or a signed int, host order, SIZE= sizeof(unsigned short) or sizeof(int). No DEFAULT.
- MAX_STAT_FIELD_NUM //VALUE is an interger, SIZE=sizeof(int), DEFAULT:1024.
-};
-
-screen_stat_handle_t FS_internal_create_handle(void);
-
-int FS_internal_set_para(screen_stat_handle_t handle, enum FS_option type,const void* value,int size);
-
-void FS_internal_start(screen_stat_handle_t handle);
-
-void FS_internal_stop(screen_stat_handle_t* handle);
-
-int FS_internal_register(screen_stat_handle_t handle,enum field_dsp_style_t style,
- enum field_calc_algo calc_type,const char* name);
-
-int FS_internal_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op,long long value);
-
-int FS_internal_register_ratio(screen_stat_handle_t handle,int numerator_id,int denominator_id,int scaling,
- enum field_dsp_style_t style,enum field_calc_algo calc_type,const char* name);
-
-#endif
diff --git a/src/inc/moodycamel_maat_rule.cpp b/src/inc/moodycamel_maat_rule.cpp
deleted file mode 100644
index b00aff0..0000000
--- a/src/inc/moodycamel_maat_rule.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/*************************************************************************
- > File Name: moodycamel_maat_rule.cpp
- > Author:
- > Mail:
- > Created Time: 2018年09月04日 星期二 16时56分42秒
- ************************************************************************/
-
-#include<iostream>
-
-using namespace std;
-
-#include <Maat_rule.h>
-
-extern "C" Maat_feather_t maat_feather(int max_thread_num,const char* table_info_path,void* logger);
-extern "C" int maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const void* value,int size);
-extern "C" int maat_initiate_feather(Maat_feather_t feather);
-extern "C" int maat_table_register(Maat_feather_t feather,const char* table_name);
-extern "C" void matt_burn_feather(Maat_feather_t feather);
-extern "C" int maat_inter_table_callback_register(Maat_feather_t feather,short table_id,
- Maat_start_callback_t *start,
- Maat_update_callback_t *update,
- Maat_finish_callback_t *finish,
- void* u_para);
-extern "C" int maat_read_state(Maat_feather_t feather, enum MAAT_STATE_OPT type, void* value, int size);
-
-extern "C" MAAT_PLUGIN_EX_DATA maat_plugin_get_EX_data(Maat_feather_t feather, int table_id, const char* key);
-
-extern "C" int maat_plugin_EX_register(Maat_feather_t feather, int table_id,
- Maat_plugin_EX_new_func_t* new_func,
- Maat_plugin_EX_free_func_t* free_func,
- Maat_plugin_EX_dup_func_t* dup_func,
- Maat_plugin_EX_key2index_func_t* key2index_func,
- long argl, void *argp);
-
-Maat_feather_t maat_feather(int max_thread_num,const char* table_info_path,void* logger)
-{
- return Maat_feather(max_thread_num, table_info_path, logger);
-}
-
-int maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const void* value,int size)
-{
- return Maat_set_feather_opt(feather, type, value, size);
-}
-
-int maat_initiate_feather(Maat_feather_t feather)
-{
- return Maat_initiate_feather(feather);
-}
-
-int maat_table_register(Maat_feather_t feather,const char* table_name)
-{
- return Maat_table_register(feather, table_name);
-}
-
-int maat_inter_table_callback_register(Maat_feather_t feather,short table_id,
- Maat_start_callback_t *start,
- Maat_update_callback_t *update,
- Maat_finish_callback_t *finish,
- void* u_para)
-{
- return Maat_table_callback_register(feather, table_id, start, update, finish, u_para);
-}
-
-
-int maat_plugin_EX_register(Maat_feather_t feather, int table_id,
- Maat_plugin_EX_new_func_t* new_func,
- Maat_plugin_EX_free_func_t* free_func,
- Maat_plugin_EX_dup_func_t* dup_func,
- Maat_plugin_EX_key2index_func_t* key2index_func,
- long argl, void *argp)
-{
- return Maat_plugin_EX_register(feather,table_id,new_func,free_func,dup_func,key2index_func,argl,argp);
-}
-
-MAAT_PLUGIN_EX_DATA maat_plugin_get_EX_data(Maat_feather_t feather, int table_id, const char* key)
-{
- return Maat_plugin_get_EX_data(feather, table_id, key);
-}
-
-int maat_read_state(Maat_feather_t feather, enum MAAT_STATE_OPT type, void* value, int size)
-{
- return Maat_read_state(feather, type, value, size);
-}
-
-void matt_burn_feather(Maat_feather_t feather)
-{
- return Maat_burn_feather(feather);
-}
-
-
diff --git a/src/inc/moodycamel_maat_rule.h b/src/inc/moodycamel_maat_rule.h
deleted file mode 100644
index 39d72e1..0000000
--- a/src/inc/moodycamel_maat_rule.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*************************************************************************
- > File Name: moodycamel_maat_rule.h
- > Author:
- > Mail:
- > Created Time: 2018年09月04日 星期二 16时55分54秒
- ************************************************************************/
-
-#ifndef _MOODYCAMEL_MAAT_RULE_H
-#define _MOODYCAMEL_MAAT_RULE_H
-
-typedef void* Maat_feather_t;
-
-enum MAAT_INIT_OPT
-{
- MAAT_OPT_SCANDIR_INTERVAL_MS=1, //VALUE is interger, SIZE=sizeof(int). DEFAULT:1,000 milliseconds.
- MAAT_OPT_EFFECT_INVERVAL_MS, //VALUE is interger, SIZE=sizeof(int). DEFAULT:60,000 milliseconds.
- MAAT_OPT_FULL_CFG_DIR, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1.DEFAULT: no default.
- MAAT_OPT_INC_CFG_DIR, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1.DEFAULT: no default.
- MAAT_OPT_JSON_FILE_PATH, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1.DEFAULT: no default.
- MAAT_OPT_STAT_ON, //VALUE is NULL, SIZE is 0. MAAT_OPT_STAT_FILE_PATH must be set. Default: stat OFF.
- MAAT_OPT_PERF_ON, //VALUE is NULL, SIZE is 0. MAAT_OPT_STAT_FILE_PATH must be set. Default: stat OFF.
- MAAT_OPT_STAT_FILE_PATH, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. DEFAULT: no default.
- MAAT_OPT_SCAN_DETAIL, //VALUE is interger *, SIZE=sizeof(int). 0: not return any detail;1: return hit pos, not include regex grouping.
- // 2 return hit pos and regex grouping pos;DEFAULT:0
- MAAT_OPT_INSTANCE_NAME, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1, no more than 11 bytes.DEFAULT: MAAT_$tableinfo_path$.
- MAAT_OPT_DECRYPT_KEY, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. No DEFAULT.
- MAAT_OPT_REDIS_IP, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. No DEFAULT.
- MAAT_OPT_REDIS_PORT, //VALUE is a unsigned short or a signed int, host order, SIZE= sizeof(unsigned short) or sizeof(int). No DEFAULT.
- MAAT_OPT_REDIS_INDEX, //VALUE is interger *, 0~15, SIZE=sizeof(int). DEFAULT: 0.
- MAAT_OPT_CMD_AUTO_NUMBERING, //VALUE is a interger *, 1 or 0, SIZE=sizeof(int). DEFAULT: 1.
- MAAT_OPT_DEFERRED_LOAD, //VALUE is NULL,SIZE is 0. Default: Deffered initialization OFF.
- MAAT_OPT_CUMULATIVE_UPDATE_OFF, //VALUE is NULL,SIZE is 0. Default: CUMMULATIVE UPDATE ON.
- MAAT_OPT_LOAD_VERSION_FROM, //VALUE is a long long, SIZE=sizeof(long long). Default: Load the Latest. Only valid in redis mode, and maybe failed for too old.
- //This option also disables background update.
- MAAT_OPT_ENABLE_UPDATE, //VALUE is interger, SIZE=sizeof(int). 1: Enabled, 0:Disabled. DEFAULT: Backgroud update is enabled. Runtime setting is allowed.
- MAAT_OPT_ACCEPT_TAGS, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. Format is a JSON, e.g.{"tags":[{"tag":"location","value":"Beijing/ChaoYang/Huayan/22A"},{"tag":"isp","value":"telecom"}]}
- MAAT_OPT_FOREIGN_CONT_DIR, //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. Specifies a local diretory to store foreign content. Default: []table_info_path]_files
- MAAT_OPT_FOREIGN_CONT_LINGER //VALUE is interger *, SIZE=sizeof(int). Greater than 0: delete after VALUE seconds; 0: delete foreign content right after the notification callbacks; Less than 0: NEVER delete. Default: 0.
- };
-
-enum MAAT_STATE_OPT
-{
- MAAT_STATE_VERSION=1, //Get current maat version. VALUE is long long, SIZE=sizeof(long long).
- MAAT_STATE_LAST_UPDATING_TABLE //Query at Maat_finish_callback_t to determine whether this table is the last one to update. VALUE is interger, SIZE=sizeof(int), 1:yes, 0: no
-};
-
-
-typedef void Maat_start_callback_t(int update_type,void* u_para);
-typedef void Maat_update_callback_t(int table_id,const char* table_line,void* u_para);
-typedef void Maat_finish_callback_t(void* u_para);
-
-typedef void* MAAT_PLUGIN_EX_DATA;
-typedef void Maat_plugin_EX_new_func_t(int table_id, const char* key, const char* table_line, MAAT_PLUGIN_EX_DATA* ad, long argl, void *argp);
-typedef void Maat_plugin_EX_free_func_t(int table_id, MAAT_PLUGIN_EX_DATA* ad, long argl, void *argp);
-typedef void Maat_plugin_EX_dup_func_t(int table_id, MAAT_PLUGIN_EX_DATA *to, MAAT_PLUGIN_EX_DATA *from, long argl, void *argp);
-typedef int Maat_plugin_EX_key2index_func_t(const char* key);
-
-Maat_feather_t maat_feather(int max_thread_num,const char* table_info_path,void* logger);
-
-int maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const void* value,int size);
-
-int maat_initiate_feather(Maat_feather_t feather);
-
-int maat_table_register(Maat_feather_t feather,const char* table_name);
-
-int maat_inter_table_callback_register(Maat_feather_t feather,short table_id,
- Maat_start_callback_t *start,
- Maat_update_callback_t *update,
- Maat_finish_callback_t *finish,
- void* u_para);
-MAAT_PLUGIN_EX_DATA maat_plugin_get_EX_data(Maat_feather_t feather, int table_id, const char* key);
-
-int maat_plugin_EX_register(Maat_feather_t feather, int table_id,
- Maat_plugin_EX_new_func_t* new_func,
- Maat_plugin_EX_free_func_t* free_func,
- Maat_plugin_EX_dup_func_t* dup_func,
- Maat_plugin_EX_key2index_func_t* key2index_func,
- long argl, void *argp);
-int maat_read_state(Maat_feather_t feather, enum MAAT_STATE_OPT type, void* value, int size);
-
-void matt_burn_feather(Maat_feather_t feather);
-
-#endif
-
diff --git a/src/inc/stream_fuzzy_hash.h b/src/inc/stream_fuzzy_hash.h
deleted file mode 100644
index 9e85e81..0000000
--- a/src/inc/stream_fuzzy_hash.h
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef _STREAM_FUZZY_HASH_
-#define _STREAM_FUZZY_HASH_
-
-/*
- * Copyright (C) MESA 2015
-
- *
- */
-
-#include <stdint.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define TOTAL_LENGTH 0
-#define EFFECTIVE_LENGTH 1
-#define HASH_LENGTH 2
-
-// typedef sfh_instance_t void*;
-typedef struct
-{
-}sfh_instance_t;
-
-/**
- * create a fuzzy hash handle and return it.
- * @return [handle]
- */
-sfh_instance_t * SFH_instance(unsigned long long origin_len);
-
-/**
- * destroy context by a fuzzy hash handle.
- * @param handle [handle]
- */
-void SFH_release(sfh_instance_t * handle);
-
-/**
- * Feed the function your data.
- * Call this function several times, if you have several parts of data to feed.
- * @param handle [handle]
- * @param data [data that you want to fuzzy_hash]
- * @param size [data size]
- * @param offset [offset]
- * @return [return effective data length in current feed]
- */
-unsigned int SFH_feed(sfh_instance_t * handle, const char* data, unsigned int size, unsigned long long offset);
-
-/**
- * Obtain the fuzzy hash values.
- * @param handle [handle]
- * @param result [fuzzy hash result]
- * Fuzzy hash result with offsets(in the square brackets, with colon splitted).
- * eg. abc[1:100]def[200:300]
- * @param size [@result size]
- * @return [return zero on success, non-zero on error]
- */
-int SFH_digest(sfh_instance_t * handle, char* result, unsigned int size);
-
-/**
- * Obtain certain length of fuzzy hash status.
- * @param handle [handle]
- * @param type [length type]
- * TOTAL_LENGTH:Total length of data you have fed.
- * Overlapped data will NOT count for 2 times.
- * EFFECTIVE_LENGTH:Length of data that involved in the calculation of hash.
- * HASH_LENGTH:Hash result length.
- * @return [length value]
- */
-unsigned long long SFH_status(sfh_instance_t * handle, int type);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/src/lib/libMESA_field_stat2.a b/src/lib/libMESA_field_stat2.a
deleted file mode 100644
index ff9be9c..0000000
--- a/src/lib/libMESA_field_stat2.a
+++ /dev/null
Binary files differ
diff --git a/src/lib/libMESA_handle_logger.a b/src/lib/libMESA_handle_logger.a
deleted file mode 100644
index 19f576a..0000000
--- a/src/lib/libMESA_handle_logger.a
+++ /dev/null
Binary files differ
diff --git a/src/lib/libMESA_prof_load.a b/src/lib/libMESA_prof_load.a
deleted file mode 100644
index 4f4c222..0000000
--- a/src/lib/libMESA_prof_load.a
+++ /dev/null
Binary files differ
diff --git a/src/lib/libhiredis.a b/src/lib/libhiredis.a
deleted file mode 100644
index f92d33b..0000000
--- a/src/lib/libhiredis.a
+++ /dev/null
Binary files differ
diff --git a/src/package/r2_certstore b/src/package/r2_certstore
deleted file mode 100644
index 94d85d5..0000000
--- a/src/package/r2_certstore
+++ /dev/null
@@ -1,3 +0,0 @@
-killall r3_certstore certstore
-./r3_certstore &> /dev/null &
-
diff --git a/src/package/r3_certstore b/src/package/r3_certstore
deleted file mode 100644
index 09cbb9f..0000000
--- a/src/package/r3_certstore
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-
-while [ 1 ]; do
- count=`ls -l core.* |wc -l`
- echo $count
- if [ $count -lt 5 ]
- then
- echo "set unlimited"
- ulimit -c unlimited
- else
- ulimit -c 0
- fi
-
- ./certstore --normal > /dev/null
- echo program crashed, restart at `date +"%w %Y/%m/%d, %H:%M:%S"` >> RESTART.log
- sleep 10
-done
diff --git a/src/script/signssl.sh b/src/script/signssl.sh
deleted file mode 100644
index 1c818df..0000000
--- a/src/script/signssl.sh
+++ /dev/null
@@ -1,204 +0,0 @@
-#!/bin/bash
-
-type_name=$1
-name=$2
-
-if [ "${type_name}" == "-caroot" ]; then
- csrfrom=$3
- csrname=$4
- csrkey=$5
-else
- cafrom=$3
- caname=$4
- cakey=$5
-
- csrfrom=$6
- csrname=$7
- csrkey=$8
-fi
-
-san_nam=$9
-
-trap "do_signal" 2
-do_signal()
-{
- echo "\n"
- read -p "Terminate theprocess? (y/n): " input
-}
-
-do_clear()
-{
- if [ -d "./demoCA" ]; then
- rm -rf ./demoCA
- fi
-
- if [ $1 -ne 0 ];then
- if [ -d "./ca-middle/$2" ]; then
- rm -rf ./ca-middle/$2
- fi
- if [ -d "./entity/$2" ]; then
- rm -rf ./entity/$2
- fi
- if [ -d "./caroot/$2" ]; then
- rm -rf ./caroot/$2
- fi
- if [ -d "./csr/$2" ]; then
- rm -rf ./csr/$2
- fi
- exit
- fi
-}
-
-do_help()
-{
- echo ""
- echo "./signssl -type cert_name -cafrom ca_name key_name -csr csr_name csr_key -san san_nam"
- echo "usage: ./signssl args"
- echo " -type - input type "-csr -caroot -camiddle -entity""
- echo " cert_name - input cert_name "input output cert namae""
- echo " -cafrom ca_name keyname - input ca_name keyname "input the root cert name and key""
- echo " -csrfrom csr_name csr_key - input csr_name csr_key "input cert signs request file name and key""
- echo " san_name - input san_name "When it is an entity cert, input user alternate name""
- echo ""
- echo "exanple -csr"
- echo "./signssl.sh -csr csr_name"
- echo "example -caroot"
- echo "./signssl.sh -caroot root_name"
- echo "example -camiddle"
- echo "./signssl.sh -camiddle middle_name -cafrom ../cert/mesalab-ca-cert.cer ../cert/mesalab-ca-cert.key -csrfrom ./csr/csrname/csrname.csr ./csr/csrname/csrname.key"
- echo "exaple -entity"
- echo "./signssl.sh -entity entity_name -cafrom ../cert/mesalab-ca-cert.cer ../cert/mesalab-ca-cert.key -csrfrom ./csr/csrname/csrname.csr ./csr/csrname/csrname.key 163"
- echo ""
- exit
-}
-
-do_mkdir()
-{
- if [ ! -d "./demoCA" ]; then
- mkdir demoCA
- mkdir ./demoCA/newcerts
- touch ./demoCA/index.txt
- touch ./demoCA/serial
- echo 0001 >> ./demoCA/serial
- fi
-}
-
-do_check()
-{
- if [ "$type_name" == "" ]||[ "$name" == "" ]; then
- echo "cert type is unkone!"
- do_help
- exit
- fi
-
- if [ "$type_name" == "-csr" ]; then
- return
- fi
-
- if [ "$type_name" == "-caroot" ]; then
- return
- fi
-
-
- if [ "$csrfrom" == "" ] || [ "$csrname" == "" ] || [ "$csrkey" == "" ]; then
- echo "input input cert signs request file name and key"
- do_help
- exit
- fi
-
- if [ "$cafrom" == "" ] || [ "$caname" == "" ] || [ "$cakey" == "" ]; then
- echo "input certificate name or key is unkone!"
- do_help
- exit
- fi
-
- if [ "$type_name" == "-entity" ];then
- if [ "$san_nam" == "" ];then
- echo "Please enter the san name!"
- do_help
- exit
- fi
-
- fi
-}
-
-do_middle()
-{
- if [ ! -d "./ca-middle/${name}" ]; then
- mkdir -p ca-middle/${name}
- fi
- outpath=ca-middle/${name}
-
- openssl ca -extensions v3_ca -in ${csrname} -out ${outpath}/${name}.cer -cert ${caname} -keyfile ${cakey} -days 365 -policy policy_anything
- openssl pkcs12 -export -in ${outpath}/${name}.cer -inkey ${csrkey} -chain -CAfile ${caname} -out ${outpath}/${name}.p12
-
- do_clear $? ${name}
- cp ${csrkey} ${outpath}
-}
-
-do_entity()
-{
- if [ ! -d "./entity/${name}" ];then
- mkdir -p entity/${name}
- fi
- outpath=entity/${name}
-
- openssl ca -in ${csrname} -keyfile ${cakey} -cert ${caname} -extensions SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:*.${san_nam}.com,DNS:*.${san_nam}.cn")) -out ${outpath}/${name}.cer
-
- openssl pkcs12 -export -in ${outpath}/${name}.cer -inkey ${csrkey} -chain -CAfile ${caname} -out ${outpath}/${name}.p12
-
- do_clear $? ${name}
- cp ${csrkey} ${outpath}
-}
-
-do_caroot()
-{
- if [ ! -d ".caroot/${name}" ];then
- mkdir -p caroot/${name}
- fi
- outpath=caroot/${name}
-
- openssl genrsa -out ${outpath}/${name}.key 1024
- openssl req -new -key ${outpath}/${name}.key -out ${outpath}/${name}.csr
- openssl x509 -req -days 365 -sha256 -extfile /etc/pki/tls/openssl.cnf -extensions v3_ca -signkey ${outpath}/${name}.key -in ${outpath}/${name}.csr -out ${outpath}/${name}.cer
- #openssl req -new -x509 -key ca.key -out ca.crt
- do_clear $? ${name}
-}
-
-do_csr()
-{
- if [ ! -d "./csr/${name}" ];then
- mkdir -p csr/${name}
- fi
- outpath=csr/${name}
-
- openssl genrsa -out ${outpath}/${name}.key 1024
- openssl req -new -key ${outpath}/${name}.key -out ${outpath}/${name}.csr
- do_clear $? ${name}
-}
-
-do_signssl()
-{
- if [ "$type_name" == "-camiddle" ]; then
- do_middle
- exit
- fi
- if [ "$type_name" == "-entity" ]; then
- do_entity
- exit
- fi
- if [ "$type_name" == "-caroot" ]; then
- do_caroot
- exit
- fi
- if [ "$type_name" == "-csr" ]; then
- do_csr
- exit
- fi
- echo "unknow command"
-}
-
-do_check
-do_mkdir
-do_signssl
-
diff --git a/src/script/tarball.sh b/src/script/tarball.sh
deleted file mode 100644
index 46366b7..0000000
--- a/src/script/tarball.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-X=certstore-base
-#X=certstore
-
-typeset -l version
-version=`lsb_release -i -s`
-version_id=`lsb_release -r -s`
-machine=`uname -m`
-issue_date=`date "+%Y%m%d"`
-
-tarball="$X-$3-$version$version_id-$machine-$issue_date".tar.gz
-
-do_mkdir(){
- cd ../release
- rm $X -rf
- mkdir $X
- mkdir $X/cert
- mkdir $X/tool
-}
-
-do_copy(){
- cp ../conf/ $X -rf
- cp ../ca/* $X/cert
- cp ../rule/ $X -rf
- cp ../src/cert_store $X/certstore
- cp ../src/package/* $X
- cp ../src/script/signssl.sh $X/tool
- cp ../src/script/x509 $X/tool
-}
-
-do_tarball(){
- tar -zcvf $1 $X
- rm $X -rf
- echo "`date` BUILD=$X COMMIT=$3 ARCHIVE=$tarball" >> release.log
-}
-
-do_mkdir
-do_copy $1
-do_tarball $tarball
-
diff --git a/src/script/x509 b/src/script/x509
deleted file mode 100644
index f39b17b..0000000
--- a/src/script/x509
+++ /dev/null
Binary files differ
diff --git a/src/x509.c b/src/x509.c
new file mode 100644
index 0000000..c219083
--- /dev/null
+++ b/src/x509.c
@@ -0,0 +1,831 @@
+/*************************************************************************
+ > File Name: cert_session.c
+ > Author:
+ > Mail:
+ > Created Time: Fri 01 Jun 2018 02:00:56 AM PDT
+ ************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <assert.h>
+
+/* openssl**/
+#include <opensslv.h>
+#include <ssl.h>
+#include <err.h>
+#include <rand.h>
+#include <x509.h>
+#include <x509v3.h>
+#include <crypto.h>
+#include <engine.h>
+#include <pkcs12.h>
+
+#include "rt_string.h"
+#include "rt_common.h"
+#include "rt_stdlib.h"
+#include "rt_file.h"
+#include "rt_time.h"
+#include "rt_tmr.h"
+
+#include "bufferevent.h"
+#include "listener.h"
+#include "event_compat.h"
+#include "http.h"
+#include "buffer.h"
+#include "util-internal.h"
+
+enum x509_input_file{
+ INPUT_FILE_CERT,
+ INPUT_FILE_KEY,
+ INPUT_FILE_CRL,
+ INPUT_FILE_LIST,
+ INPUT_FILE_CHECK,
+ INPUT_FILE_CHAIN,
+};
+
+#define LOCAL_USER_PEN 1
+#define LOCAL_USER_DER 2
+#define LOCAL_USER_P12 3
+
+BIO *bio_err = NULL;
+
+static const struct value_string format_vals[] =
+{
+ {LOCAL_USER_PEN, "PEM TEXT FILE"},
+ {LOCAL_USER_DER, "DER BINARY FILE"},
+ {LOCAL_USER_P12, "P12 BINARY FILE"},
+};
+
+static void help()
+{
+ printf("Welcome to x509 %s\n", "1.1.1");
+ printf("x509 <-incert |-inkey | -incrl | -inlist> arg\n"
+ "Usage:\n"
+ " -incert | input certificate file\n"
+ " -inkey | input private key file\n"
+ " -incrl | input certificate revocation list\n"
+ " -inlist | input certificate list file,format = pem\n"
+ " -incheck | input certificate file and intpu key file\n");
+}
+
+static X509* base_load_pkcs12(BIO *in, EVP_PKEY **pkey, X509 **x, STACK_OF(X509) **ca)
+{
+ PKCS12 *p12;
+ const char *pass = "";
+
+ X509 *_x = NULL;
+ EVP_PKEY *_pkey;
+ STACK_OF(X509) *_ca = NULL;
+
+ OpenSSL_add_all_algorithms();
+ ERR_load_crypto_strings();
+
+ p12 = d2i_PKCS12_bio(in, NULL);
+ if (p12 == NULL) {
+ goto finish;
+ }
+ if (!PKCS12_parse(p12, pass, &_pkey, &_x, &_ca)) {
+ goto finish;
+ }
+
+ if (x)
+ *x = _x;
+ if (pkey)
+ *pkey = _pkey;
+ if (ca)
+ *ca = _ca;
+
+ finish:
+ if (p12)
+ PKCS12_free(p12);
+ return _x;
+}
+
+static void cert_base_load_stack_info(BIO * in_bio, STACK_OF(X509) **stack_ca)
+{
+ int x509_cnt = 0;
+ X509_INFO *x509_info;
+ STACK_OF(X509) *stack_x509 = NULL;
+ STACK_OF(X509_INFO) *stack_x509_info = NULL;
+
+ if ((stack_x509 = sk_X509_new_null()) == NULL)
+ {
+ X509err(X509_F_X509_VERIFY_CERT, ERR_R_MALLOC_FAILURE);
+ goto finish;
+ }
+
+ stack_x509_info = PEM_X509_INFO_read_bio(in_bio, NULL, NULL, NULL);
+ if (stack_x509_info == NULL)
+ {
+ X509err(X509_F_X509_LOAD_CERT_CRL_FILE, ERR_R_PEM_LIB);
+ goto finish;
+ }
+
+ while (sk_X509_INFO_num(stack_x509_info)) {
+ x509_info = sk_X509_INFO_shift(stack_x509_info);
+ if (x509_info->x509 != NULL) {
+ sk_X509_push(stack_x509, x509_info->x509);
+ x509_info->x509 = NULL;
+ x509_cnt++;
+ }
+ X509_INFO_free(x509_info);
+ }
+ if (x509_cnt >= 1)
+ *stack_ca = stack_x509;
+
+finish:
+ if (stack_x509_info != NULL)
+ sk_X509_INFO_free(stack_x509_info);
+ return;
+}
+
+static X509 *
+cert_base_load_x509 (BIO * in_bio, STACK_OF(X509) **stack_ca, int iFormat)
+{
+ X509 *x = NULL;
+
+ switch (iFormat)
+ {
+ case LOCAL_USER_DER:
+ x = d2i_X509_bio (in_bio, NULL);
+ break;
+ case LOCAL_USER_PEN:
+ x = PEM_read_bio_X509 (in_bio, NULL, NULL, NULL);
+ cert_base_load_stack_info(in_bio, stack_ca);
+ break;
+ case LOCAL_USER_P12:
+ x = base_load_pkcs12(in_bio, NULL, &x, stack_ca);
+ break;
+ default:
+ break;
+ }
+ return x;
+}
+
+static X509 *
+cert_load_x509(char *file, int *informat, STACK_OF(X509) **stack_ca)
+{
+ BIO *in = NULL;
+ X509 *x509 = NULL;
+
+ if(!file){
+ goto finish;
+ }
+
+ if ((in = BIO_new(BIO_s_file())) == NULL) {
+ goto finish;
+ }
+ if (BIO_read_filename(in, file) <= 0) {
+ goto finish;
+ }
+
+ /**try pem */
+ if ((x509 = cert_base_load_x509(in, stack_ca, LOCAL_USER_PEN)) != NULL){
+ *informat = LOCAL_USER_PEN;
+ goto end;
+ }
+ (void)BIO_reset (in);
+ if ((x509 = cert_base_load_x509(in, stack_ca, LOCAL_USER_P12)) != NULL){
+ *informat = LOCAL_USER_P12;
+ goto end;
+ }
+ (void)BIO_reset (in);
+ if ((x509 = cert_base_load_x509(in, stack_ca, LOCAL_USER_DER)) != NULL){
+ *informat = LOCAL_USER_DER;
+ goto end;
+ }
+end:
+ BIO_free (in);
+ in = NULL;
+finish:
+ return x509;
+}
+
+EVP_PKEY * cert_base_key_x509 (BIO * bio, int iFormat, char *strPwd)
+{
+ EVP_PKEY *pkey = NULL;
+
+ switch (iFormat){
+ case LOCAL_USER_PEN:
+ pkey = PEM_read_bio_PrivateKey (bio, NULL, NULL, strPwd);
+ break;
+ case LOCAL_USER_P12:
+ base_load_pkcs12(bio, &pkey, NULL, NULL);
+ break;
+ default:
+ break;
+ }
+
+ return pkey;
+}
+
+EVP_PKEY * cert_load_key(char *keyfile, int *informat)
+{
+ EVP_PKEY *pkey = NULL;
+ BIO *in = NULL;
+
+ if(!keyfile){
+ goto finish;
+ }
+ if ((in = BIO_new(BIO_s_file())) == NULL) {
+ goto finish;
+ }
+ if (BIO_read_filename(in, keyfile) <= 0) {
+ goto finish;
+ }
+
+ if ((pkey = cert_base_key_x509 (in, LOCAL_USER_PEN, "")) != NULL){
+ *informat = LOCAL_USER_PEN;
+ goto finish;
+ }
+ (void)BIO_reset (in);
+ if ((pkey = cert_base_key_x509 (in, LOCAL_USER_P12, "")) != NULL){
+ *informat = LOCAL_USER_P12;
+ goto finish;
+ }
+finish:
+ if (in != NULL)
+ BIO_free (in);
+ return pkey;
+}
+
+int x509_get_ValidDate(X509 *x509)
+{
+ BIO *STDout = NULL;
+
+ STDout = BIO_new_fp(stdout, BIO_NOCLOSE);
+
+ printf("CA notBefore : ");
+ ASN1_TIME_print(STDout, X509_get_notBefore(x509));
+ printf("\n");
+ printf("CA notAfter : ");
+ ASN1_TIME_print(STDout, X509_get_notAfter(x509));
+ printf("\n");
+ BIO_free_all(STDout);
+ return 0;
+}
+#if 0
+static char*
+x509_get_alt_name(X509 *x509)
+{
+ int i, size = 0, gtype = 0;
+ char *gnname = NULL;
+
+ GENERAL_NAMES* subjectAltNames = (GENERAL_NAMES*)X509_get_ext_d2i(x509, NID_subject_alt_name, NULL, NULL);
+ int cnt = sk_GENERAL_NAME_num(subjectAltNames);
+
+ if (cnt < 0)
+ goto finish;
+
+ gnname = (char *)malloc(2048);
+ if (!gnname)
+ goto finish;
+ memset(gnname, 0, 2048);
+
+ for (i = 0; i < cnt; i++)
+ {
+ GENERAL_NAME* generalName = sk_GENERAL_NAME_value(subjectAltNames, i);
+ ASN1_STRING *uri = GENERAL_NAME_get0_value(generalName, &gtype);
+ if (gtype == GEN_DNS)
+ {
+ size += snprintf(gnname + size, 2048, "%s, ", ASN1_STRING_data(uri));
+ if (size < 0)
+ continue;
+ if (size >= 2048)
+ break;
+ }
+ }
+
+finish:
+ return gnname;
+}
+#endif
+
+void x509_get_name(X509_NAME *name, int obase)
+{
+ BIO *out = NULL;
+
+ out = BIO_new(BIO_s_file());
+ if (out == NULL) {
+ ERR_print_errors(bio_err);
+ goto finish;
+ }
+ BIO_set_fp(out, stdout, BIO_NOCLOSE);
+ X509_NAME_print(out, name, obase);
+
+finish:
+ if (out != NULL)
+ BIO_free_all(out);
+ return;
+}
+
+char *x509_get_cn(X509 *x509)
+{
+ char *CName = NULL;
+ int iLen = 0, CNlen = 256;
+ X509_NAME *pSubName = NULL;
+
+ pSubName = X509_get_subject_name(x509);
+ if (!pSubName){
+ goto finish;
+ }
+ CName = kmalloc(CNlen, MPF_CLR, -1);
+ if (!CName){
+ goto finish;
+ }
+ iLen = X509_NAME_get_text_by_NID(pSubName, NID_commonName, CName, CNlen-1);
+ if (iLen > 0){
+ return CName;
+ }
+finish:
+ return NULL;
+}
+
+char *x509_get_SubjectName(X509 *x509)
+{
+ int iLen = 0;
+ char *csSubName = NULL;
+ char csBuf[256] = {0};
+ X509_NAME *pSubName = NULL;
+
+ csSubName = (char *)malloc(1024);
+ if (!csSubName)
+ goto finish;
+
+ pSubName = X509_get_subject_name(x509);
+ if (!pSubName){
+ goto finish;
+ }
+ memset(csBuf, 0, 256);
+ memset(csSubName, 0, 1024);
+ iLen = X509_NAME_get_text_by_NID(pSubName, NID_countryName, csBuf, 255);
+ if (iLen > 0){
+ strcat(csSubName, "C=");
+ strcat(csSubName, csBuf);
+ strcat(csSubName, ", ");
+ }
+ memset(csBuf, 0, 256);
+ iLen = X509_NAME_get_text_by_NID(pSubName, NID_organizationName, csBuf, 255);
+ if (iLen > 0){
+ strcat(csSubName, "O=");
+ strcat(csSubName, csBuf);
+ strcat(csSubName, ", ");
+ }
+ memset(csBuf, 0, 256);
+ iLen = X509_NAME_get_text_by_NID(pSubName, NID_organizationalUnitName, csBuf, 255);
+ if (iLen > 0) {
+ strcat(csSubName, "OU=");
+ strcat(csSubName, csBuf);
+ strcat(csSubName, ", ");
+ }
+ memset(csBuf, 0, 256);
+ iLen = X509_NAME_get_text_by_NID(pSubName, NID_commonName, csBuf, 255);
+ if (iLen > 0){
+ strcat(csSubName, "CN=");
+ strcat(csSubName, csBuf);
+ }
+finish:
+ return csSubName;
+}
+
+char* x509_get_ExtBasicConstraints(X509 *x509)
+{
+ int crit = 0;
+ char value[512] = {0};
+ BASIC_CONSTRAINTS *bcons = NULL;
+
+ if (!x509)
+ return NULL;
+
+ bcons = (BASIC_CONSTRAINTS*)X509_get_ext_d2i(x509, NID_basic_constraints, &crit, NULL);
+ if (!bcons)
+ return NULL;
+ if (!bcons->ca)
+ {
+ strcat(value, "Subject Type=End Entity; ");
+ strcat(value, "Path Length Constraint=None");
+ }
+ else
+ {
+ char temp[128] = {0};
+ if (bcons->pathlen != NULL)
+ snprintf(temp, 128, "Path Length Constraint=%d", bcons->pathlen->type);
+ else
+ snprintf(temp, 128, "Path Length Constraint=None");
+ strcat(value, "Subject Type=CA; ");
+ strcat(value, temp);
+ }
+ BASIC_CONSTRAINTS_free(bcons);
+
+ char *base_cons = NULL;
+ int base_cons_len = strlen(value) + 1;
+
+ base_cons = (char *)malloc(base_cons_len);
+ if (!base_cons)
+ return NULL;
+ strncpy(base_cons, value, base_cons_len);
+ return base_cons;
+}
+
+static char*
+x509_get_fingerprint(X509 *x509)
+{
+ char *rkey = NULL;
+ unsigned int len = 0, i = 0;
+ char hex[EVP_MAX_MD_SIZE] = {0};
+ unsigned char fdig[EVP_MAX_MD_SIZE] = {0};
+
+ rkey = (char *)malloc(512);
+ if (!rkey)
+ goto finish;
+
+ X509_digest(x509, EVP_sha1(), fdig, &len);
+ for (i = 0; i < len ; ++i){
+ sprintf(hex + i * sizeof(unsigned char) * 2, "%02x", fdig[i]);
+ }
+ snprintf(rkey, 511, "%s", hex);
+finish:
+ return rkey;
+}
+
+char *x509_get_sn(X509 *x509)
+{
+ ASN1_INTEGER *asn1_i = NULL;
+ BIGNUM *bignum = NULL;
+ char *serial = NULL;
+
+ asn1_i = X509_get_serialNumber(x509);
+ bignum = ASN1_INTEGER_to_BN(asn1_i, NULL);
+ if (bignum == NULL) {
+ goto finish;
+ }
+ serial = BN_bn2hex(bignum);
+ if (serial == NULL) {
+ goto finish;
+ }
+ BN_free(bignum);
+finish:
+ return serial;
+}
+
+char *x509_get_version(X509 *x509)
+{
+ unsigned int v = 0;
+
+ v = X509_get_version(x509);
+ switch(v){
+ case 0:
+ return "V1";
+ case 1:
+ return "V2";
+ case 2:
+ return "V3";
+ default:
+ break;
+ }
+ return NULL;
+}
+
+int X509_check_valid_date(X509 *x509)
+{
+ int day, sec;
+
+ /*Certificate is issued earlier than the current time*/
+ if (ASN1_TIME_diff(&day, &sec, X509_get_notBefore(x509), NULL) == 0)
+ return -1;
+ if (day <= 0 && sec <= 0)
+ return -1;
+ /*Certificate expiration is less than the current time*/
+ if (ASN1_TIME_diff(&day, &sec, NULL, X509_get_notAfter(x509)) == 0)
+ return -1;
+ if (day <= 0 && sec <= 0)
+ return -1;
+ /*Certificate expires less than the date of issue*/
+ if (ASN1_TIME_diff(&day, &sec, X509_get_notBefore(x509), X509_get_notAfter(x509)) == 0)
+ return -1;
+ if (day <= 0 && sec <= 0)
+ return -1;
+ return 0;
+}
+
+int x509_parse_cert(char *certfile)
+{
+ int xret = -1;
+ int informat = 0;
+ X509 *x509 = NULL;
+ STACK_OF(X509) *stack_ca = NULL;
+
+ x509 = cert_load_x509(certfile, &informat, &stack_ca);
+ if (!x509){
+ printf("unable to load certificate\n");
+ goto finish;
+ }
+ printf("Successful certificate conversion\n");
+ printf("Ca Format : %s\n", val_to_str(informat, format_vals));
+
+ char *constraints = NULL;
+ constraints = x509_get_ExtBasicConstraints(x509);
+ printf("Ca Constraints : %s\n", (constraints != NULL)?constraints: "NULL");
+ /*end-entity certificate san**/
+ if (STRSTR(constraints, "End Entity"))
+ {
+ char *cn = x509_get_cn(x509);
+ if (!cn || X509_check_host(x509, cn, strlen(cn), 0, NULL) != 1)
+ {
+ printf("Match host name: %s\n", "ERR_CERT_COMMON_NAME_INVALID");
+ }
+ kfree(cn);
+ }
+ kfree(constraints);
+ if (informat == LOCAL_USER_P12 || informat == LOCAL_USER_PEN){
+ if (stack_ca){
+ printf("Chain Length : %d\n", sk_X509_num(stack_ca) + 1);
+
+ }else{
+ printf("Chain Length : %d\n", 1);
+ }
+ }
+ printf("Ca Version : %s\n", (x509_get_version(x509) != NULL)?x509_get_version(x509) : "NULL");
+ printf("Ca Serial : %s\n", (x509_get_sn(x509) != NULL)?x509_get_sn(x509) : "NULL");
+ printf("Ca Issuer : ");
+ x509_get_name(X509_get_issuer_name(x509), 16);
+ printf("\n");
+ printf("Ca SubjectName : ");
+ x509_get_name(X509_get_subject_name(x509), 16);
+ printf("\n");
+ printf("Ca Fingerprint : %s\n", x509_get_fingerprint(x509));
+ x509_get_ValidDate(x509);
+ if (X509_check_valid_date(x509) < 0)
+ {
+ printf("CA state : ERR_CERT_DATE_INVALID\n");
+ }
+ xret = 0;
+finish:
+ return xret;
+}
+
+int x509_parse_key(char *keyfile)
+{
+ int xret = -1;
+ int informat = 0;
+ EVP_PKEY *pkey = NULL;
+
+ pkey = cert_load_key(keyfile, &informat);
+ if (!pkey){
+ printf("unable to load private key\n");
+ goto finish;
+ }
+ printf("Successful private key conversion\n");
+ printf("Key Format : %s\n", val_to_str(informat, format_vals));
+ xret = 0;
+finish:
+ return xret;
+}
+
+static X509_CRL *
+x509_load_crl(char *crlfile, int *informat)
+{
+ BIO *in = NULL;
+ X509_CRL *x = NULL;
+
+ in = BIO_new(BIO_s_file());
+ if (in == NULL) {
+ ERR_print_errors(bio_err);
+ goto free;
+ }
+ if (BIO_read_filename(in, crlfile) <= 0) {
+ perror(crlfile);
+ goto finish;
+ }
+
+ if ((x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL)) != NULL){
+ *informat = LOCAL_USER_PEN;
+ goto finish;
+ }
+
+ if ((x = d2i_X509_CRL_bio(in, NULL)) != NULL){
+ *informat = LOCAL_USER_DER;
+ goto finish;
+ }
+
+free:
+ BIO_free(in);
+finish:
+ return x;
+}
+
+char *x509_get_crlNumber(X509_CRL *crl)
+{
+ ASN1_INTEGER *crlnum;
+ BIGNUM *bignum = NULL;
+ char *crl_number = NULL;
+
+ crlnum = X509_CRL_get_ext_d2i(crl, NID_crl_number, NULL, NULL);
+ bignum = ASN1_INTEGER_to_BN(crlnum, NULL);
+ if (bignum == NULL) {
+ goto finish;
+ }
+ crl_number = BN_bn2dec(bignum);
+ if (crl_number == NULL) {
+ goto finish;
+ }
+ BN_free(bignum);
+finish:
+ return crl_number;
+}
+
+int x509_parse_crl(char *crlfile)
+{
+ X509_CRL *crl = NULL;
+ int informat = 0;
+ int xret = -1;
+
+ crl = x509_load_crl(crlfile, &informat);
+ if (!crl){
+ printf("unable to load Certificate Revocation List\n");
+ goto finish;
+ }
+
+ printf("Successful certificate revocation list conversion\n");
+ long l = 0;
+ l = X509_CRL_get_version(crl);
+ printf("CRL Format : %s\n", val_to_str(informat, format_vals));
+ printf("CRL Version : %lu\n", l + 1);
+ printf("CRL Issuer : ");
+ x509_get_name(X509_CRL_get_issuer(crl), 16);
+ printf("\n");
+ printf("CRL Number : %s\n", x509_get_crlNumber(crl));
+
+finish:
+ return xret;
+}
+
+static int
+x509_parse_cert_list(char *certlist)
+{
+ int xret = 0;
+ BIO *in = NULL;
+ X509* x = NULL;
+ int count = 0;
+
+ in = BIO_new(BIO_s_file());
+ if (in == NULL) {
+ ERR_print_errors(bio_err);
+ goto finish;
+ }
+ if (BIO_read_filename(in, certlist) <= 0) {
+ perror(certlist);
+ goto err;
+ }
+
+ printf("Certificate List:\n");
+ for (;;) {
+ x = PEM_read_bio_X509_AUX(in, NULL, NULL, NULL);
+ if (x == NULL) {
+ if (count == 0)
+ printf("bad input format specified for input cert list\n");
+ goto err;
+ }
+
+ printf("Cert list Issuer : ");
+ x509_get_name(X509_get_issuer_name(x), 16);
+ printf("\n");
+ count++;
+ X509_free(x);
+ x = NULL;
+ }
+err:
+ if (x != NULL)
+ X509_free(x);
+ if (in != NULL)
+ BIO_free(in);
+ printf("Certificate List Number : %d\n", count);
+finish:
+ return xret;
+}
+
+static int
+decoder_argv_parser(int argc, char **argv, char **infile, char **infile2)
+{
+ int i = 0;
+ int iformat = -1;
+
+ for (i = 0; argv[i] != NULL; i++){
+ /** run version parser */
+ if (STRCMP (argv[i], "-inkey") == 0){
+ if (--argc < 1)
+ goto help;
+ *infile = argv[i+1];
+ iformat = INPUT_FILE_KEY;
+ break;
+ }
+ if (STRCMP(argv[i], "-incert") == 0){
+ if (--argc < 1)
+ goto help;
+ *infile = argv[i+1];
+ iformat = INPUT_FILE_CERT;
+ break;
+ }
+ if (STRCMP(argv[i], "-incrl") == 0){
+ if (--argc < 1)
+ goto help;
+ *infile = argv[i+1];
+ iformat = INPUT_FILE_CRL;
+ break;
+ }
+ if (STRCMP(argv[i], "-inlist")== 0){
+ if (--argc < 1)
+ goto help;
+ *infile = argv[i+1];
+ iformat = INPUT_FILE_LIST;
+ break;
+ }
+ if (STRCMP(argv[i], "-incheck") == 0){
+ if (--argc < 1)
+ goto help;
+ *infile = argv[i+1];
+ *infile2 = argv[i+2];
+ iformat = INPUT_FILE_CHECK;
+ break;
+ }
+ }
+ goto finish;
+help:
+ help();
+finish:
+ return iformat;
+}
+
+static int
+x509_parse_check(char *cafile, char *keyfile)
+{
+ int informat = 0;
+ EVP_PKEY *pkey = NULL;
+
+ pkey = cert_load_key(keyfile, &informat);
+ if (!pkey){
+ printf("unable to load private key\n");
+ goto finish;
+ }
+
+ X509 *x509 = NULL;
+ STACK_OF(X509) *stack_ca = NULL;
+
+ x509 = cert_load_x509(cafile, &informat, &stack_ca);
+ if (!x509){
+ printf("unable to load certificate\n");
+ goto finish;
+ }
+ if (!X509_check_private_key(x509, pkey)) {
+ printf("Matching failure\n");
+ }else{
+ printf("Successful matching\n");
+ }
+finish:
+ return 0;
+}
+
+int x509_check_format(int argc, char **argv)
+{
+ int iformat = -1;
+ char *infile = NULL, *infile2 = NULL;
+
+ iformat = decoder_argv_parser(argc, argv, &infile, &infile2);
+ if (!infile && iformat < 0)
+ goto help;
+
+ switch(iformat){
+ case INPUT_FILE_KEY:
+ x509_parse_key(infile);
+ break;
+ case INPUT_FILE_CERT:
+ x509_parse_cert(infile);
+ break;
+ case INPUT_FILE_CRL:
+ x509_parse_crl(infile);
+ break;
+ case INPUT_FILE_LIST:
+ x509_parse_cert_list(infile);
+ break;
+ case INPUT_FILE_CHECK:
+ x509_parse_check(infile, infile2);
+ break;
+ default:
+ goto help;
+ }
+ goto finish;
+help:
+ help();
+finish:
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ x509_check_format(argc, argv);
+}
+
+