More minor IPI work.
[dragonfly/vkernel-mp.git] / lib / libncp / ncpl_rpc.c
blob75506fa8bb0843ced7931684791a1e359cb08f2b
1 /*
2 * Copyright (c) 1999, Boris Popov
3 * All rights reserved.
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. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by Boris Popov.
16 * 4. Neither the name of the author nor the names of any co-contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 * NetWare RPCs
33 * $FreeBSD: src/lib/libncp/ncpl_rpc.c,v 1.1 1999/10/12 11:56:41 bp Exp $
34 * $DragonFly: src/lib/libncp/ncpl_rpc.c,v 1.2 2003/06/17 06:26:50 dillon Exp $
36 #include <sys/types.h>
37 #include <sys/time.h>
38 #include <errno.h>
39 #include <stdio.h>
40 #include <strings.h>
41 #include <netncp/ncp_lib.h>
43 struct ncp_rpc_rq {
44 nuint16 len; /* HL */
45 nuint8 subfn;
46 nuint32 reserved[4];
47 nuint8 flags[4];
48 } __attribute__ ((packed));
50 struct ncp_rpc_rp {
51 nuint32 rpccode;
52 nuint32 reserved[4];
53 nuint32 rpcval;
54 } __attribute__ ((packed));
56 static NWCCODE
57 ncp_rpc(NWCONN_HANDLE cH, int rpcfn,
58 const nuint8* rpcarg, char* arg1, char *arg2,
59 nuint32* rpcval) {
60 NWCCODE error;
61 NW_FRAGMENT rq[4], rp;
62 struct ncp_rpc_rq rqh;
63 struct ncp_rpc_rp rph;
65 rqh.subfn = rpcfn;
66 if (rpcarg)
67 bcopy(rpcarg, rqh.reserved, 4 * 4 + 4);
68 else
69 bzero(rqh.reserved, 4 * 4 + 4);
70 rq[0].fragAddress = (char*)&rqh;
71 rq[0].fragSize = sizeof(rqh);
72 rq[1].fragAddress = arg1;
73 rq[1].fragSize = strlen(arg1) + 1;
74 rq[2].fragAddress = arg2;
75 rq[2].fragSize = arg2 ? (strlen(arg2) + 1) : 0;
76 rqh.len = htons(rq[2].fragSize + rq[1].fragSize + sizeof(rqh) - 2);
77 rp.fragAddress = (char*)&rph;
78 rp.fragSize = sizeof(rph);
79 error = NWRequest(cH, 131, 3, rq, 1, &rp);
80 if (error) return error;
81 if (rp.fragSize < 4) return EBADRPC;
82 error = rph.rpccode;
83 if (error) return error;
84 if (rpcval) {
85 if (rp.fragSize < 24)
86 return EBADRPC;
87 *rpcval = rph.rpcval;
89 return 0;
92 NWCCODE
93 NWSMLoadNLM(NWCONN_HANDLE cH, pnstr8 cmd) {
94 return ncp_rpc(cH, 1, NULL, cmd, NULL, NULL);
97 NWCCODE
98 NWSMUnloadNLM(NWCONN_HANDLE cH, pnstr8 cmd) {
99 return ncp_rpc(cH, 2, NULL, cmd, NULL, NULL);
102 NWCCODE
103 NWSMMountVolume(NWCONN_HANDLE cH, pnstr8 volName, nuint32* volnum) {
104 return ncp_rpc(cH, 3, NULL, volName, NULL, volnum);
107 NWCCODE
108 NWSMDismountVolumeByName(NWCONN_HANDLE cH, pnstr8 vol) {
109 return ncp_rpc(cH, 4, NULL, vol, NULL, NULL);
112 struct ncp_set_hdr {
113 nuint32 typeFlag; /* 0 - str, 1 - value */
114 nuint32 value;
115 nuint32 pad[20 - 4 - 4];
116 } __attribute__ ((packed));
118 NWCCODE
119 NWSMSetDynamicCmdIntValue(NWCONN_HANDLE cH, pnstr8 setCommandName, nuint32 cmdValue) {
120 struct ncp_set_hdr rq;
122 memset(&rq, 0, sizeof(rq));
123 rq.typeFlag = 1;
124 rq.value = cmdValue;
125 return ncp_rpc(cH, 6, (char*)&rq, setCommandName, NULL, NULL);
128 NWCCODE
129 NWSMSetDynamicCmdStrValue(NWCONN_HANDLE cH, pnstr8 setCommandName,
130 pnstr8 cmdValue) {
131 return ncp_rpc(cH, 6, NULL, setCommandName, cmdValue, NULL);
134 NWCCODE
135 NWSMExecuteNCFFile(NWCONN_HANDLE cH, pnstr8 NCFFileName) {
136 return ncp_rpc(cH, 7, NULL, NCFFileName, NULL, NULL);