Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>This is a one command at a time function a colleague wrote. Still wondering if more can be done in terms of flexibility, efficiency, and speed.</p> <pre><code>/* * lcmd - execute LISTSERV command * * This function connects to a LISTSERV host and executes a single command * using the supplied credentials. * * Returns result from command if successful; otherwise, returns FALSE. */ function lcmd($host, $port, $user, $password, $cmd) { $request_header = ""; $request_body = ""; $response_header = ""; $response_body = ""; $length = 0; $status; $result; /* * Get host address */ $host = gethostbyname($host); /* * Connect to server */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (!$socket) { return FALSE; } $status = socket_connect($socket, $host, $port); if (!$status) { return FALSE; } /* * Format request body */ $request_body = "${cmd} PW=${password}"; $length = strlen($user) + strlen($request_body) + 1; /* * Format request header */ $request_header = array(); $request_header[] = "1B\r\n"; $request_header[] = chr((int)($length / 256)); $request_header[] = chr($length % 255); $request_header[] = chr(strlen($user)); $request_header[] = $user; $request_header = implode($request_header); /* * Send request header */ $status = socket_send( $socket, $request_header, strlen($request_header), 0 ); if (strlen($request_header) != $status) { return FALSE; } /* * Receive response header */ while (socket_recv($socket, $b, 1, 0) == 1) { $response_header .= $b; if ("\n" == $b) { break; } } $status = (int)$response_header; /* * If status is not 250, then the is refusing the request. */ if (250 != $status) { return FALSE; } /* * Send request body */ $status = socket_send( $socket, $request_body, strlen($request_body), 0 ); if (strlen($request_body) != $status) { return FALSE; } /* * Receive response body * * The first 8 bytes of the body is two unsigned 32-bit integers * that define the status of the command and the length of the * result. */ $status = socket_recv($socket, $response_body, 8, 0); if (8 != $status) { return FALSE; } /* * Decode unsigned 32-bit big-endian integer status and result * length. */ $response_body = str_split($response_body); $status = ( (ord($response_body[0]) &lt;&lt; 24 ) | (ord($response_body[1]) &lt;&lt; 16 ) | (ord($response_body[2]) &lt;&lt; 8 ) | (ord($response_body[3]) &lt;&lt; 0 ) ); $length = ( (ord($response_body[4]) &lt;&lt; 24 ) | (ord($response_body[5]) &lt;&lt; 16 ) | (ord($response_body[6]) &lt;&lt; 8 ) | (ord($response_body[7]) &lt;&lt; 0 ) ); /* * If status is not 0, then command execution has failed. */ if (0 != $status) { return FALSE; } /* * Receive result */ $status = socket_recv($socket, $result, $length, MSG_WAITALL); if ($length != $status) { return FALSE; } /* * Disconnect from server */ socket_close($socket); /* * Return */ return $result; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload