-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathEPMDResponse.php
More file actions
115 lines (98 loc) · 4.55 KB
/
EPMDResponse.php
File metadata and controls
115 lines (98 loc) · 4.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
class EPMDResponse {
/**
* Erlang Distribution Protocol: PORTPLEASE2_RESP
* @param socket_resource &$socket Reference to the active socket with a buffer ready to be read.
* @return array|string Framed response array from EPMD on success, or an error string if something goes wrong.
*/
function PortPlease2_Resp(&$socket) {
return EPMDResponse::read_socket($socket, 122);
}
/**
* Erlang Distribution Protocol: ALIVE2_RESP
* @param socket_resource &$socket Reference to the active socket with a buffer ready to be read.
* @return array|string Framed response array from EPMD on success, or an error string if something goes wrong.
*/
function Alive2_Resp(&$socket) {
return EPMDResponse::read_socket($socket, 120);
}
/**
* Erlang Distribution Protocol: ALIVE2_RESP
* @param socket_resource &$socket Reference to the active socket with a buffer ready to be read.
* @return array|string Framed response array from EPMD on success, or an error string if something goes wrong.
*/
function Names_Resp(&$socket) {
return EPMDResponse::read_socket($socket, 4369);
}
/**
* Frames all responses from the EPMD daemon. The code isn't very aesthetically pleasing, but it's easy to figure out what's going on.
* @param socket_resource &$socket Reference to the active socket with a buffer ready to be read.
* @param int $resp_code The request code for the corresponding response code. 120 = ALIVE2_REQ, 122 = PORT_PLEASE2_REQ, 110 = NAMES_REQ, 100 = DUMP_REQ, 107 = KILL_REQ
* @return array|string Framed response array from EPMD on success, or an error string if something goes wrong.
*/
function read_socket(&$socket, $resp_code) {
$error = NULL;
$response = NULL;
switch($resp_code) {
case 120:
$response['response_code'] = implode(unpack("C", socket_read($socket, 1)));
if($response['response_code'] == 121) {
$response['result'] = implode(unpack("C", socket_read($socket, 1)));
if($response['result'] < 1) {
$response['creation'] = implode(unpack("n", socket_read($socket, 2)));
} else {
$error = "<strong>EPMD Error:</strong> Request 120 (Alive2) responded with an unspecified error. Good luck.";
}
} else {
$error = "<strong>EPMD Error:</strong> Request 120 (Alive2) expected a response code of 121. Got " . $response['response_code'];
}
break;
case 122:
$response['response_code'] = implode(unpack("C", socket_read($socket, 1)));
if($response['response_code'] == 119) {
$response['result'] = implode(unpack("C", socket_read($socket, 1)));
if($response['result'] < 1) {
$response['port'] = implode(unpack("n", socket_read($socket, 2)));
$response['nodetype'] = implode(unpack("C", socket_read($socket, 1)));
$response['protocol'] = implode(unpack("C", socket_read($socket, 1)));
$response['highestversion'] = implode(unpack("n", socket_read($socket, 2)));
$response['lowestversion'] = implode(unpack("n", socket_read($socket, 2)));
$response['nlen'] = implode(unpack("n", socket_read($socket, 2)));
$response['nodename'] = EPMDResponse::decode_string(unpack("C*", socket_read($socket, $response['nlen'])));
$response['elen'] = implode(unpack("C", socket_read($socket, 1)));
$response['extra'] = ($response['elen'] > 0) ? EPMDResponse::decode_string(unpack("C*", socket_read($socket, $response['elen']))) : NULL;
} else {
$error = "<strong>EPMD Error:</strong> Request 112 (PortPlease2) responded with an unspecified error. This usually happens if you have requested information about a nonexistent or down node.";
}
} else {
$error = "<strong>EPMD Error:</strong> Request 122 (PortPlease2) expected a response code of 119. Got " . $response['response_code'];
}
break;
case 4369:
$response = array();
$buffer = explode("\n", socket_read($socket, 99999));
array_pop($buffer);
foreach($buffer as $key=>$entry) {
$sn = explode(" at port ", $entry);
$sn[0] = str_replace("name ", "", $sn[0]);
$response[$key]['name'] = $sn[0];
$response[$key]['port'] = $sn[1];
}
return $response;
break;
}
return (!is_null($error)) ? $error : $response;
}
/**
* Given an array of ASCII character codes, returns the string it represents
* @param array $byte_array Array of ASCII character codes
* @return string The characters, nicely crashed n' smashed for your reading pleasure.
*/
function decode_string($byte_array) {
$decoded = "";
foreach($byte_array as $char) {
$decoded .= chr($char);
}
return $decoded;
}
}