--- sourceforge.net/trunk/rdesktop/mcs.c 2000/08/15 10:23:24 10 +++ sourceforge.net/trunk/rdesktop/mcs.c 2001/09/14 13:51:38 30 @@ -1,7 +1,7 @@ /* rdesktop: A Remote Desktop Protocol client. Protocol services - Multipoint Communications Service - Copyright (C) Matthew Chapman 1999-2000 + Copyright (C) Matthew Chapman 1999-2001 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,7 +23,8 @@ uint16 mcs_userid; /* Parse an ASN.1 BER header */ -static BOOL ber_parse_header(STREAM s, int tagval, int *length) +static BOOL +ber_parse_header(STREAM s, int tagval, int *length) { int tag, len; @@ -33,12 +34,11 @@ } else { - in_uint8(s, tag) - } + in_uint8(s, tag)} if (tag != tagval) { - ERROR("expected tag %d, got %d\n", tagval, tag); + error("expected tag %d, got %d\n", tagval, tag); return False; } @@ -51,13 +51,15 @@ while (len--) next_be(s, *length); } - else *length = len; + else + *length = len; return s_check(s); } /* Output an ASN.1 BER header */ -static void ber_out_header(STREAM s, int tagval, int length) +static void +ber_out_header(STREAM s, int tagval, int length) { if (tagval > 0xff) { @@ -73,33 +75,37 @@ out_uint8(s, 0x82); out_uint16_be(s, length); } - else out_uint8(s, length); + else + out_uint8(s, length); } /* Output an ASN.1 BER integer */ -static void ber_out_integer(STREAM s, int value) +static void +ber_out_integer(STREAM s, int value) { ber_out_header(s, BER_TAG_INTEGER, 2); out_uint16_be(s, value); } /* Output a DOMAIN_PARAMS structure (ASN.1 BER) */ -static void mcs_out_domain_params(STREAM s, int max_channels, int max_users, - int max_tokens, int max_pdusize) +static void +mcs_out_domain_params(STREAM s, int max_channels, int max_users, + int max_tokens, int max_pdusize) { ber_out_header(s, MCS_TAG_DOMAIN_PARAMS, 32); ber_out_integer(s, max_channels); ber_out_integer(s, max_users); ber_out_integer(s, max_tokens); - ber_out_integer(s, 1); /* num_priorities */ - ber_out_integer(s, 0); /* min_throughput */ - ber_out_integer(s, 1); /* max_height */ + ber_out_integer(s, 1); /* num_priorities */ + ber_out_integer(s, 0); /* min_throughput */ + ber_out_integer(s, 1); /* max_height */ ber_out_integer(s, max_pdusize); - ber_out_integer(s, 2); /* ver_protocol */ + ber_out_integer(s, 2); /* ver_protocol */ } /* Parse a DOMAIN_PARAMS structure (ASN.1 BER) */ -static BOOL mcs_parse_domain_params(STREAM s) +static BOOL +mcs_parse_domain_params(STREAM s) { int length; @@ -110,24 +116,25 @@ } /* Send an MCS_CONNECT_INITIAL message (ASN.1 BER) */ -static void mcs_send_connect_initial(STREAM mcs_data) +static void +mcs_send_connect_initial(STREAM mcs_data) { int datalen = mcs_data->end - mcs_data->data; - int length = 7 + 3*34 + 4 + datalen; + int length = 7 + 3 * 34 + 4 + datalen; STREAM s; s = iso_init(length + 5); ber_out_header(s, MCS_CONNECT_INITIAL, length); - ber_out_header(s, BER_TAG_OCTET_STRING, 0); /* calling domain */ - ber_out_header(s, BER_TAG_OCTET_STRING, 0); /* called domain */ + ber_out_header(s, BER_TAG_OCTET_STRING, 0); /* calling domain */ + ber_out_header(s, BER_TAG_OCTET_STRING, 0); /* called domain */ ber_out_header(s, BER_TAG_BOOLEAN, 1); - out_uint8(s, 0xff); /* upward flag */ + out_uint8(s, 0xff); /* upward flag */ - mcs_out_domain_params(s, 2, 2, 0, 0xffff); /* target params */ - mcs_out_domain_params(s, 1, 1, 1, 0x420); /* min params */ - mcs_out_domain_params(s, 0xffff, 0xfc17, 0xffff, 0xffff); /* max params */ + mcs_out_domain_params(s, 2, 2, 0, 0xffff); /* target params */ + mcs_out_domain_params(s, 1, 1, 1, 0x420); /* min params */ + mcs_out_domain_params(s, 0xffff, 0xfc17, 0xffff, 0xffff); /* max params */ ber_out_header(s, BER_TAG_OCTET_STRING, datalen); out_uint8p(s, mcs_data->data, datalen); @@ -137,7 +144,8 @@ } /* Expect a MCS_CONNECT_RESPONSE message (ASN.1 BER) */ -static BOOL mcs_recv_connect_response(STREAM mcs_data) +static BOOL +mcs_recv_connect_response(STREAM mcs_data) { uint8 result; int length; @@ -153,18 +161,18 @@ in_uint8(s, result); if (result != 0) { - ERROR("MCS connect: %d\n", result); + error("MCS connect: %d\n", result); return False; } ber_parse_header(s, BER_TAG_INTEGER, &length); - in_uint8s(s, length); /* connect id */ + in_uint8s(s, length); /* connect id */ mcs_parse_domain_params(s); ber_parse_header(s, BER_TAG_OCTET_STRING, &length); if (length > mcs_data->size) { - WARN("MCS data length %d\n", length); + error("MCS data length %d\n", length); length = mcs_data->size; } @@ -176,22 +184,24 @@ } /* Send an EDrq message (ASN.1 PER) */ -static void mcs_send_edrq() +static void +mcs_send_edrq() { STREAM s; s = iso_init(5); out_uint8(s, (MCS_EDRQ << 2)); - out_uint16_be(s, 1); /* height */ - out_uint16_be(s, 1); /* interval */ + out_uint16_be(s, 1); /* height */ + out_uint16_be(s, 1); /* interval */ s_mark_end(s); iso_send(s); } /* Send an AUrq message (ASN.1 PER) */ -static void mcs_send_aurq() +static void +mcs_send_aurq() { STREAM s; @@ -204,7 +214,8 @@ } /* Expect a AUcf message (ASN.1 PER) */ -static BOOL mcs_recv_aucf(uint16 *mcs_userid) +static BOOL +mcs_recv_aucf(uint16 *mcs_userid) { uint8 opcode, result; STREAM s; @@ -216,14 +227,14 @@ in_uint8(s, opcode); if ((opcode >> 2) != MCS_AUCF) { - ERROR("expected AUcf, got %d\n", opcode); + error("expected AUcf, got %d\n", opcode); return False; } in_uint8(s, result); if (result != 0) { - ERROR("AUrq: %d\n", result); + error("AUrq: %d\n", result); return False; } @@ -234,7 +245,8 @@ } /* Send a CJrq message (ASN.1 PER) */ -static void mcs_send_cjrq(uint16 chanid) +static void +mcs_send_cjrq(uint16 chanid) { STREAM s; @@ -249,7 +261,8 @@ } /* Expect a CJcf message (ASN.1 PER) */ -static BOOL mcs_recv_cjcf() +static BOOL +mcs_recv_cjcf() { uint8 opcode, result; STREAM s; @@ -261,26 +274,27 @@ in_uint8(s, opcode); if ((opcode >> 2) != MCS_CJCF) { - ERROR("expected CJcf, got %d\n", opcode); + error("expected CJcf, got %d\n", opcode); return False; } in_uint8(s, result); if (result != 0) { - ERROR("CJrq: %d\n", result); + error("CJrq: %d\n", result); return False; } - in_uint8s(s, 4); /* mcs_userid, req_chanid */ + in_uint8s(s, 4); /* mcs_userid, req_chanid */ if (opcode & 2) - in_uint8s(s, 2); /* join_chanid */ + in_uint8s(s, 2); /* join_chanid */ return s_check_end(s); } /* Initialise an MCS transport data packet */ -STREAM mcs_init(int length) +STREAM +mcs_init(int length) { STREAM s; @@ -291,7 +305,8 @@ } /* Send an MCS transport data packet */ -void mcs_send(STREAM s) +void +mcs_send(STREAM s) { uint16 length; @@ -302,14 +317,15 @@ out_uint8(s, (MCS_SDRQ << 2)); out_uint16_be(s, mcs_userid); out_uint16_be(s, MCS_GLOBAL_CHANNEL); - out_uint8(s, 0x70); /* flags */ + out_uint8(s, 0x70); /* flags */ out_uint16_be(s, length); iso_send(s); } /* Receive an MCS transport data packet */ -STREAM mcs_recv() +STREAM +mcs_recv() { uint8 opcode, appid, length; STREAM s; @@ -324,21 +340,22 @@ { if (appid != MCS_DPUM) { - ERROR("expected data, got %d\n", opcode); + error("expected data, got %d\n", opcode); } return NULL; } - in_uint8s(s, 5); /* userid, chanid, flags */ + in_uint8s(s, 5); /* userid, chanid, flags */ in_uint8(s, length); if (length & 0x80) - in_uint8s(s, 1); /* second byte of length */ + in_uint8s(s, 1); /* second byte of length */ return s; } /* Establish a connection up to the MCS layer */ -BOOL mcs_connect(char *server, STREAM mcs_data) +BOOL +mcs_connect(char *server, STREAM mcs_data) { if (!iso_connect(server)) return False; @@ -363,13 +380,14 @@ return True; - error: + error: iso_disconnect(); return False; } /* Disconnect from the MCS layer */ -void mcs_disconnect() +void +mcs_disconnect() { iso_disconnect(); }