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