register.c revision 9ef0b394
1266e564dSmrg/******************************************************************************
2266e564dSmrg
3266e564dSmrg
4266e564dSmrgCopyright 1993, 1998  The Open Group
5266e564dSmrg
6266e564dSmrgPermission to use, copy, modify, distribute, and sell this software and its
7266e564dSmrgdocumentation for any purpose is hereby granted without fee, provided that
8266e564dSmrgthe above copyright notice appear in all copies and that both that
9266e564dSmrgcopyright notice and this permission notice appear in supporting
10266e564dSmrgdocumentation.
11266e564dSmrg
12266e564dSmrgThe above copyright notice and this permission notice shall be included in
13266e564dSmrgall copies or substantial portions of the Software.
14266e564dSmrg
15266e564dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16266e564dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17266e564dSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18266e564dSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19266e564dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20266e564dSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21266e564dSmrg
22266e564dSmrgExcept as contained in this notice, the name of The Open Group shall not be
23266e564dSmrgused in advertising or otherwise to promote the sale, use or other dealings
24266e564dSmrgin this Software without prior written authorization from The Open Group.
25266e564dSmrg
26266e564dSmrgAuthor: Ralph Mor, X Consortium
27266e564dSmrg******************************************************************************/
28266e564dSmrg
29266e564dSmrg#ifdef HAVE_CONFIG_H
30266e564dSmrg#include <config.h>
31266e564dSmrg#endif
32266e564dSmrg#include <X11/ICE/ICElib.h>
33266e564dSmrg#include "ICElibint.h"
34266e564dSmrg
35266e564dSmrgint
36c5629e66SmrgIceRegisterForProtocolSetup (
379ef0b394Smrg	const char		*protocolName,
389ef0b394Smrg	const char		*vendor,
399ef0b394Smrg	const char		*release,
40c5629e66Smrg	int			versionCount,
41c5629e66Smrg	IcePoVersionRec		*versionRecs,
42c5629e66Smrg	int			authCount,
43c5629e66Smrg	const char	        **authNames,
44c5629e66Smrg	IcePoAuthProc		*authProcs,
45c5629e66Smrg	IceIOErrorProc		IOErrorProc
46c5629e66Smrg)
47266e564dSmrg{
48266e564dSmrg    _IcePoProtocol 	*p;
49266e564dSmrg    int			opcodeRet, i;
50266e564dSmrg
51266e564dSmrg    for (i = 1; i <= _IceLastMajorOpcode; i++)
52266e564dSmrg	if (strcmp (protocolName, _IceProtocols[i - 1].protocol_name) == 0)
53266e564dSmrg	{
54266e564dSmrg	    if (_IceProtocols[i - 1].orig_client != NULL)
55266e564dSmrg	    {
56266e564dSmrg		/*
57266e564dSmrg		 * We've already registered this protocol.
58266e564dSmrg		 */
599ef0b394Smrg
60266e564dSmrg		return (i);
61266e564dSmrg	    }
62266e564dSmrg	    else
63266e564dSmrg	    {
64266e564dSmrg		break;
65266e564dSmrg	    }
66266e564dSmrg	}
679ef0b394Smrg
68266e564dSmrg    if (i <= _IceLastMajorOpcode)
69266e564dSmrg    {
70266e564dSmrg	p = _IceProtocols[i - 1].orig_client =
71266e564dSmrg	    (_IcePoProtocol *) malloc (sizeof (_IcePoProtocol));
72266e564dSmrg	opcodeRet = i;
73266e564dSmrg    }
74266e564dSmrg    else if (_IceLastMajorOpcode == 255 ||
75266e564dSmrg	versionCount < 1 ||
76266e564dSmrg	strlen (protocolName) == 0)
77266e564dSmrg    {
78266e564dSmrg	return (-1);
79266e564dSmrg    }
80266e564dSmrg    else
81266e564dSmrg    {
82266e564dSmrg	char *name;
83266e564dSmrg
84266e564dSmrg	_IceProtocols[_IceLastMajorOpcode].protocol_name = name =
85266e564dSmrg	    strdup(protocolName);
86266e564dSmrg
87266e564dSmrg	p = _IceProtocols[_IceLastMajorOpcode].orig_client =
88266e564dSmrg	    (_IcePoProtocol *) malloc (sizeof (_IcePoProtocol));
89266e564dSmrg
90266e564dSmrg	_IceProtocols[_IceLastMajorOpcode].accept_client = NULL;
91266e564dSmrg
92266e564dSmrg	opcodeRet = ++_IceLastMajorOpcode;
93266e564dSmrg    }
94266e564dSmrg
95266e564dSmrg    p->vendor = strdup(vendor);
96266e564dSmrg    p->release = strdup(release);
97266e564dSmrg
98266e564dSmrg    p->version_count = versionCount;
99266e564dSmrg
100266e564dSmrg    p->version_recs = (IcePoVersionRec *) malloc (
101266e564dSmrg	versionCount * sizeof (IcePoVersionRec));
102266e564dSmrg    memcpy (p->version_recs, versionRecs,
103266e564dSmrg	versionCount * sizeof (IcePoVersionRec));
104266e564dSmrg
105266e564dSmrg    if ((p->auth_count = authCount) > 0)
106266e564dSmrg    {
107266e564dSmrg	p->auth_names = (char **) malloc (
108266e564dSmrg	    authCount * sizeof (char *));
109266e564dSmrg
110266e564dSmrg	p->auth_procs = (IcePoAuthProc *) malloc (
111266e564dSmrg	    authCount * sizeof (IcePoAuthProc));
112266e564dSmrg
113266e564dSmrg	for (i = 0; i < authCount; i++)
114266e564dSmrg	{
115266e564dSmrg	    p->auth_names[i] = strdup(authNames[i]);
116266e564dSmrg	    p->auth_procs[i] = authProcs[i];
117266e564dSmrg	}
118266e564dSmrg    }
119266e564dSmrg    else
120266e564dSmrg    {
121266e564dSmrg	p->auth_names = NULL;
122266e564dSmrg	p->auth_procs = NULL;
123266e564dSmrg    }
124266e564dSmrg
125266e564dSmrg    p->io_error_proc = IOErrorProc;
126266e564dSmrg
127266e564dSmrg    return (opcodeRet);
128266e564dSmrg}
129266e564dSmrg
130266e564dSmrg
131266e564dSmrg
132266e564dSmrgint
133c5629e66SmrgIceRegisterForProtocolReply (
1349ef0b394Smrg	const char			*protocolName,
1359ef0b394Smrg	const char			*vendor,
1369ef0b394Smrg	const char			*release,
137c5629e66Smrg	int				versionCount,
138c5629e66Smrg	IcePaVersionRec			*versionRecs,
139c5629e66Smrg	int				authCount,
140c5629e66Smrg	const char			**authNames,
141c5629e66Smrg	IcePaAuthProc			*authProcs,
142c5629e66Smrg	IceHostBasedAuthProc		hostBasedAuthProc,
143c5629e66Smrg	IceProtocolSetupProc		protocolSetupProc,
144c5629e66Smrg	IceProtocolActivateProc		protocolActivateProc,
145c5629e66Smrg	IceIOErrorProc			IOErrorProc
146c5629e66Smrg)
147266e564dSmrg{
148266e564dSmrg    _IcePaProtocol 	*p;
149266e564dSmrg    int			opcodeRet, i;
150266e564dSmrg
151266e564dSmrg    for (i = 1; i <= _IceLastMajorOpcode; i++)
152266e564dSmrg	if (strcmp (protocolName, _IceProtocols[i - 1].protocol_name) == 0)
153266e564dSmrg	{
154266e564dSmrg	    if (_IceProtocols[i - 1].accept_client != NULL)
155266e564dSmrg	    {
156266e564dSmrg		/*
157266e564dSmrg		 * We've already registered this protocol.
158266e564dSmrg		 */
1599ef0b394Smrg
160266e564dSmrg		return (i);
161266e564dSmrg	    }
162266e564dSmrg	    else
163266e564dSmrg	    {
164266e564dSmrg		break;
165266e564dSmrg	    }
166266e564dSmrg	}
1679ef0b394Smrg
168266e564dSmrg
169266e564dSmrg    if (i <= _IceLastMajorOpcode)
170266e564dSmrg    {
171266e564dSmrg	p = _IceProtocols[i - 1].accept_client =
172266e564dSmrg	    (_IcePaProtocol *) malloc (sizeof (_IcePaProtocol));
173266e564dSmrg	opcodeRet = i;
174266e564dSmrg    }
175266e564dSmrg    else if (_IceLastMajorOpcode == 255 ||
176266e564dSmrg	versionCount < 1 ||
177266e564dSmrg	strlen (protocolName) == 0)
178266e564dSmrg    {
179266e564dSmrg	return (-1);
180266e564dSmrg    }
181266e564dSmrg    else
182266e564dSmrg    {
183266e564dSmrg	char *name;
184266e564dSmrg
185266e564dSmrg	_IceProtocols[_IceLastMajorOpcode].protocol_name = name =
186266e564dSmrg	    strdup(protocolName);
187266e564dSmrg
188266e564dSmrg	_IceProtocols[_IceLastMajorOpcode].orig_client = NULL;
189266e564dSmrg
190266e564dSmrg	p = _IceProtocols[_IceLastMajorOpcode].accept_client =
191266e564dSmrg	    (_IcePaProtocol *) malloc (sizeof (_IcePaProtocol));
192266e564dSmrg
193266e564dSmrg	opcodeRet = ++_IceLastMajorOpcode;
194266e564dSmrg    }
195266e564dSmrg
196266e564dSmrg    p->vendor = strdup(vendor);
197266e564dSmrg    p->release = strdup(release);
198266e564dSmrg
199266e564dSmrg    p->version_count = versionCount;
200266e564dSmrg
201266e564dSmrg    p->version_recs = (IcePaVersionRec *) malloc (
202266e564dSmrg	versionCount * sizeof (IcePaVersionRec));
203266e564dSmrg    memcpy (p->version_recs, versionRecs,
204266e564dSmrg	versionCount * sizeof (IcePaVersionRec));
205266e564dSmrg
206266e564dSmrg    p->protocol_setup_proc = protocolSetupProc;
207266e564dSmrg    p->protocol_activate_proc = protocolActivateProc;
208266e564dSmrg
209266e564dSmrg    if ((p->auth_count = authCount) > 0)
210266e564dSmrg    {
211266e564dSmrg	p->auth_names = (char **) malloc (
212266e564dSmrg	    authCount * sizeof (char *));
213266e564dSmrg
214266e564dSmrg	p->auth_procs = (IcePaAuthProc *) malloc (
215266e564dSmrg	    authCount * sizeof (IcePaAuthProc));
216266e564dSmrg
217266e564dSmrg	for (i = 0; i < authCount; i++)
218266e564dSmrg	{
219266e564dSmrg	    p->auth_names[i] = strdup(authNames[i]);
220266e564dSmrg	    p->auth_procs[i] = authProcs[i];
221266e564dSmrg	}
222266e564dSmrg    }
223266e564dSmrg    else
224266e564dSmrg    {
225266e564dSmrg	p->auth_names = NULL;
226266e564dSmrg	p->auth_procs = NULL;
227266e564dSmrg    }
228266e564dSmrg
229266e564dSmrg    p->host_based_auth_proc = hostBasedAuthProc;
230266e564dSmrg
231266e564dSmrg    p->io_error_proc = IOErrorProc;
232266e564dSmrg
233266e564dSmrg    return (opcodeRet);
234266e564dSmrg}
235266e564dSmrg
236