PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/code/classes/Daemon/DNSd/Type/RFC1035.class.php

https://github.com/blekkzor/pinetd2
PHP | 96 lines | 91 code | 5 blank | 0 comment | 5 complexity | c4d42a44c860a08145bf65d3e37824f0 MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. namespace Daemon\DNSd\Type;
  3. class RFC1035 extends Base {
  4. const TYPE_A = 1;
  5. const TYPE_NS = 2;
  6. const TYPE_CNAME = 5;
  7. const TYPE_SOA = 6;
  8. const TYPE_PTR = 12;
  9. const TYPE_MX = 15;
  10. const TYPE_TXT = 16;
  11. const TYPE_AXFR = 252;
  12. const TYPE_ANY = 255;
  13. public function decode($val, array $context) {
  14. switch($this->type) {
  15. case self::TYPE_A:
  16. $this->value = inet_ntop($val);
  17. break;
  18. case self::TYPE_NS:
  19. $foo_offset = 0;
  20. $this->value = $this->pkt->decodeLabel($val, $foo_offset);
  21. break;
  22. case self::TYPE_CNAME:
  23. $foo_offset = 0;
  24. $this->value = $this->pkt->decodeLabel($val, $foo_offset);
  25. break;
  26. case self::TYPE_SOA:
  27. $this->value = array();
  28. $offset = 0;
  29. $this->value['mname'] = $this->pkt->decodeLabel($val, $offset); // master name
  30. $this->value['rname'] = $this->pkt->decodeLabel($val, $offset); // responsible email
  31. $next_values = unpack('Nserial/Nrefresh/Nretry/Nexpire/Nminimum', substr($val, $offset));
  32. foreach($next_values as $var => $val) $this->value[$var] = $val;
  33. break;
  34. case self::TYPE_MX:
  35. $tmp = unpack('n', $val);
  36. $this->value = array(
  37. 'priority' => $tmp[0],
  38. 'host' => substr($val, 2),
  39. );
  40. break;
  41. case self::TYPE_TXT:
  42. $len = ord($val[0]);
  43. if ((strlen($val) + 1) < $len) {
  44. $this->value = NULL;
  45. break;
  46. }
  47. $this->value = substr($val, 1, $len);
  48. break;
  49. case self::TYPE_AXFR:
  50. $this->value = NULL;
  51. break;
  52. case self::TYPE_ANY:
  53. $this->value = NULL;
  54. break;
  55. default: // unknown type
  56. $this->value = $val;
  57. return false;
  58. }
  59. return true;
  60. }
  61. public function encode($val = NULL, $offset = NULL) {
  62. if (is_null($val)) $val = $this->value;
  63. switch($this->type) {
  64. case self::TYPE_A:
  65. $enc = inet_pton($val);
  66. if (strlen($enc) != 4) $enc = "\0\0\0\0";
  67. return $enc;
  68. case self::TYPE_NS:
  69. return $this->pkt->encodeLabel($val, $offset);
  70. case self::TYPE_CNAME:
  71. return $this->pkt->encodeLabel($val, $offset);
  72. case self::TYPE_SOA:
  73. $res = '';
  74. $res .= $this->pkt->encodeLabel($val['mname'], $offset);
  75. $res .= $this->pkt->encodeLabel($val['rname'], $offset+strlen($res));
  76. $res .= pack('NNNNN', $val['serial'], $val['refresh'], $val['retry'], $val['expire'], $val['minimum']);
  77. return $res;
  78. case self::TYPE_MX:
  79. return pack('n', $val['priority']).$this->pkt->encodeLabel($val['host'], $offset+2);
  80. case self::TYPE_TXT:
  81. if (strlen($val) > 255) $val = substr($val, 0, 255);
  82. return chr(strlen($val)) . $val;
  83. case self::TYPE_AXFR:
  84. return '';
  85. case self::TYPE_ANY:
  86. return '';
  87. default: // unknown type
  88. return $val;
  89. }
  90. }
  91. }