1/* 2 * Copyright (c) 1999, Boris Popov 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the author nor the names of any co-contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#include <sys/cdefs.h> 31__FBSDID("$FreeBSD$"); 32 33#include <sys/types.h> 34#include <errno.h> 35#include <stdio.h> 36#include <string.h> 37 38#include <netncp/ncp_lib.h> 39#include <netncp/ncp_nls.h> 40 41NWCCODE 42NWDisableBroadcasts(NWCONN_HANDLE connHandle) { 43 DECLARE_RQ; 44 45 ncp_init_request_s(conn, 2); 46 return ncp_request(connHandle, 21, conn); 47} 48 49NWCCODE 50NWEnableBroadcasts(NWCONN_HANDLE connHandle) { 51 DECLARE_RQ; 52 53 ncp_init_request_s(conn, 3); 54 return ncp_request(connHandle, 21, conn); 55} 56 57NWCCODE 58NWBroadcastToConsole(NWCONN_HANDLE connHandle, pnstr8 message) { 59 int l, error; 60 DECLARE_RQ; 61 62 l = strlen(message); 63 if (l > 60) return EMSGSIZE; 64 ncp_init_request_s(conn, 9); 65 ncp_add_byte(conn, l); 66 ncp_add_mem_nls(conn, message, l); 67 error = ncp_request(connHandle, 21, conn); 68 return error; 69} 70 71NWCCODE 72NWSendBroadcastMessage(NWCONN_HANDLE connHandle, pnstr8 message, 73 nuint16 connCount, pnuint16 connList, pnuint8 resultList) 74{ 75 int l, i, error; 76 DECLARE_RQ; 77 78 l = strlen(message); 79 if (l > 255) return EMSGSIZE; 80 if (connCount > 350) return EINVAL; 81 82 ncp_init_request_s(conn, 0x0A); 83 ncp_add_word_lh(conn, connCount); 84 for (i = 0; i < connCount; i++) 85 ncp_add_dword_lh(conn, connList[i]); 86 ncp_add_byte(conn, l); 87 ncp_add_mem_nls(conn, message, l); 88 error = ncp_request(connHandle, 0x15, conn); 89 if (!error) { 90 l = ncp_reply_word_lh(conn, 0); 91 for (i = 0; i < l; i++) 92 resultList[i] = ncp_reply_dword_lh(conn, (i)*4 + 2); 93 return 0; 94 } 95 if (error != 0xfb) return error; 96 if (l > 58) return EMSGSIZE; 97 ncp_init_request_s(conn, 0); 98 ncp_add_byte(conn, connCount); 99 for (i = 0; i < connCount; i++) 100 ncp_add_byte(conn, connList[i]); 101 ncp_add_byte(conn, l); 102 ncp_add_mem_nls(conn, message, l); 103 error = ncp_request(connHandle, 0x15, conn); 104 if (error) return error; 105 i = ncp_reply_byte(conn, 0); 106 memcpy(resultList, ncp_reply_data(conn, 1), i); 107 return 0; 108} 109 110 111NWCCODE 112NWGetBroadcastMessage(NWCONN_HANDLE connHandle, pnstr8 message) { 113 int i, error; 114 DECLARE_RQ; 115 116 ncp_init_request_s(conn, 0x0B); 117 error = ncp_request(connHandle, 0x15, conn); 118 if (error) { 119 if (error != 0x89fb) return error; 120 ncp_init_request_s(conn, 0x01); 121 if ((error = ncp_request(connHandle, 0x15, conn)) != 0) 122 return error; 123 } 124 i = ncp_reply_byte(conn, 0); 125 if (i == 0) return ENOENT; 126 memcpy(message, ncp_reply_data(conn, 1), i); 127 message[i] = 0; 128 ncp_nls_str_n2u(message, message); 129 return 0; 130} 131