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 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 -#include -#include -#include - -#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 -#include -#include -#include -#include -#include - -#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 -#include -#include -#include -#include -#include -#include -#include - -#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 -#include -#include -#include -#include -#include - -/* openssl**/ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#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, >ype); - 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", - "sample@sample.com"}; - - 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, ¶ms); - id = evhttp_find_header(¶ms, "keyring_id"); - if (id) - *keyring_id = atoi(id); - _valid = evhttp_find_header(¶ms, "is_valid"); - if (_valid) - *is_valid = atoi(_valid); - _sni = evhttp_find_header(¶ms, "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(¶ms); - 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 -#include -#include -#include - -#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 - * - * 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 -# include -#endif /* STDC_HEADERS */ - -#if defined(HAVE_STRINGS_H) && !defined(_STRING_H) && !defined(__USE_BSD) -# include -#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 - * - * 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 - * - * 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 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 header file. */ -#define HAVE_ENDIAN_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_FCNTL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_LIMITS_H 1 - -/* Define to 1 if you have the 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 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 header file. */ -#define HAVE_STDARG_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the 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 header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the 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 header file. */ -#define HAVE_SYSLOG_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_CDEFS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_PARAM_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the 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 "json-c@googlegroups.com" - -/* 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 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 - * - * 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 -#include -#include -#include - -#if HAVE_SYSLOG_H -# include -#endif /* HAVE_SYSLOG_H */ - -#if HAVE_UNISTD_H -# include -#endif /* HAVE_UNISTD_H */ - -#if HAVE_SYS_PARAM_H -#include -#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 - * 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 - -#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 - * 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 -#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 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 -#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 - * 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 -#include -#include -#include -#include -#include - -#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 - * 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 - -#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:
-* * Thread-safe: NO
-* * Reentrant: NO -* -******************************************************************************* -*/ - - -#ifndef JSON_OBJECT_ITERATOR_H -#define JSON_OBJECT_ITERATOR_H - -#include - -#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 - * - * 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 - * - * 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 -#include -#include -#include -#include -#include -#include - -#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 -#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 - * - * 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 -#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 - * - * 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 -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_SYS_TYPES_H -#include -#endif /* HAVE_SYS_TYPES_H */ - -#ifdef HAVE_SYS_STAT_H -#include -#endif /* HAVE_SYS_STAT_H */ - -#ifdef HAVE_FCNTL_H -#include -#endif /* HAVE_FCNTL_H */ - -#ifdef HAVE_UNISTD_H -# include -#endif /* HAVE_UNISTD_H */ - -#ifdef WIN32 -# define WIN32_LEAN_AND_MEAN -# include -# include -#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 - * - * 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 -#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 - * 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 -#include -#include -#include -#include -#include - -#ifdef HAVE_ENDIAN_H -# include /* 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 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 - * 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 -#define isnan(x) _isnan(x) -# endif -#endif - -#ifndef HAVE_DECL_ISINF -# ifdef HAVE_DECL__FINITE -#include -#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 -#include - -#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 - * - * 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 -#include -#include - -#ifdef HAVE_STDARG_H -# include -#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 - * - * 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 - * - * 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 -#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 -#include -#include -#include -#include -#include - -#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 -#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 - -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 - * - * 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 - * Copyright (c) 2010-2011, Pieter Noordhuis - * - * 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 - * Copyright (c) 2010-2014, Pieter Noordhuis - * Copyright (c) 2015, Matt Stancliff , - * Jan-Erik Rediger - * - * 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 /* for va_list */ -#include /* for struct timeval */ -#include /* 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 - * - * 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 -#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 -#include -#include -#include -#include -#include -#include -#include - -#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 - * Copyright (c) 2010-2011, Pieter Noordhuis - * - * 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 /* 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 - * 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 -#include -#include - -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 -#include -#include -#include -#include -#include -#include -#include -#include - -#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 -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 -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 -#include -#include -#include - -/* - * 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 - -#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: zhengchao@iie.ac.cn, 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 -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. "ا" - CHARSET_UNICODE_NCR_HEX, //SGML Numeric character reference,hexdecimal base, e.g. "ا" - 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 - -#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 -#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 - -using namespace std; - -#include - -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 -#include - -#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 Binary files a/src/lib/libMESA_field_stat2.a and /dev/null differ diff --git a/src/lib/libMESA_handle_logger.a b/src/lib/libMESA_handle_logger.a deleted file mode 100644 index 19f576a..0000000 Binary files a/src/lib/libMESA_handle_logger.a and /dev/null differ diff --git a/src/lib/libMESA_prof_load.a b/src/lib/libMESA_prof_load.a deleted file mode 100644 index 4f4c222..0000000 Binary files a/src/lib/libMESA_prof_load.a and /dev/null differ diff --git a/src/lib/libhiredis.a b/src/lib/libhiredis.a deleted file mode 100644 index f92d33b..0000000 Binary files a/src/lib/libhiredis.a and /dev/null 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 Binary files a/src/script/x509 and /dev/null 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 +#include +#include +#include +#include +#include + +/* openssl**/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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, >ype); + 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); +} + +