register.c revision 266e564d
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
37266e564dSmrgIceRegisterForProtocolSetup (protocolName, vendor, release,
38266e564dSmrg    versionCount, versionRecs, authCount, authNames, authProcs, IOErrorProc)
39266e564dSmrg
40266e564dSmrgchar			*protocolName;
41266e564dSmrgchar			*vendor;
42266e564dSmrgchar			*release;
43266e564dSmrgint			versionCount;
44266e564dSmrgIcePoVersionRec		*versionRecs;
45266e564dSmrgint			authCount;
46266e564dSmrgchar		        **authNames;
47266e564dSmrgIcePoAuthProc		*authProcs;
48266e564dSmrgIceIOErrorProc		IOErrorProc;
49266e564dSmrg
50266e564dSmrg{
51266e564dSmrg    _IcePoProtocol 	*p;
52266e564dSmrg    int			opcodeRet, i;
53266e564dSmrg
54266e564dSmrg    for (i = 1; i <= _IceLastMajorOpcode; i++)
55266e564dSmrg	if (strcmp (protocolName, _IceProtocols[i - 1].protocol_name) == 0)
56266e564dSmrg	{
57266e564dSmrg	    if (_IceProtocols[i - 1].orig_client != NULL)
58266e564dSmrg	    {
59266e564dSmrg		/*
60266e564dSmrg		 * We've already registered this protocol.
61266e564dSmrg		 */
62266e564dSmrg
63266e564dSmrg		return (i);
64266e564dSmrg	    }
65266e564dSmrg	    else
66266e564dSmrg	    {
67266e564dSmrg		break;
68266e564dSmrg	    }
69266e564dSmrg	}
70266e564dSmrg
71266e564dSmrg    if (i <= _IceLastMajorOpcode)
72266e564dSmrg    {
73266e564dSmrg	p = _IceProtocols[i - 1].orig_client =
74266e564dSmrg	    (_IcePoProtocol *) malloc (sizeof (_IcePoProtocol));
75266e564dSmrg	opcodeRet = i;
76266e564dSmrg    }
77266e564dSmrg    else if (_IceLastMajorOpcode == 255 ||
78266e564dSmrg	versionCount < 1 ||
79266e564dSmrg	strlen (protocolName) == 0)
80266e564dSmrg    {
81266e564dSmrg	return (-1);
82266e564dSmrg    }
83266e564dSmrg    else
84266e564dSmrg    {
85266e564dSmrg	char *name;
86266e564dSmrg
87266e564dSmrg	_IceProtocols[_IceLastMajorOpcode].protocol_name = name =
88266e564dSmrg	    strdup(protocolName);
89266e564dSmrg
90266e564dSmrg	p = _IceProtocols[_IceLastMajorOpcode].orig_client =
91266e564dSmrg	    (_IcePoProtocol *) malloc (sizeof (_IcePoProtocol));
92266e564dSmrg
93266e564dSmrg	_IceProtocols[_IceLastMajorOpcode].accept_client = NULL;
94266e564dSmrg
95266e564dSmrg	opcodeRet = ++_IceLastMajorOpcode;
96266e564dSmrg    }
97266e564dSmrg
98266e564dSmrg    p->vendor = strdup(vendor);
99266e564dSmrg    p->release = strdup(release);
100266e564dSmrg
101266e564dSmrg    p->version_count = versionCount;
102266e564dSmrg
103266e564dSmrg    p->version_recs = (IcePoVersionRec *) malloc (
104266e564dSmrg	versionCount * sizeof (IcePoVersionRec));
105266e564dSmrg    memcpy (p->version_recs, versionRecs,
106266e564dSmrg	versionCount * sizeof (IcePoVersionRec));
107266e564dSmrg
108266e564dSmrg    if ((p->auth_count = authCount) > 0)
109266e564dSmrg    {
110266e564dSmrg	p->auth_names = (char **) malloc (
111266e564dSmrg	    authCount * sizeof (char *));
112266e564dSmrg
113266e564dSmrg	p->auth_procs = (IcePoAuthProc *) malloc (
114266e564dSmrg	    authCount * sizeof (IcePoAuthProc));
115266e564dSmrg
116266e564dSmrg	for (i = 0; i < authCount; i++)
117266e564dSmrg	{
118266e564dSmrg	    p->auth_names[i] = strdup(authNames[i]);
119266e564dSmrg	    p->auth_procs[i] = authProcs[i];
120266e564dSmrg	}
121266e564dSmrg    }
122266e564dSmrg    else
123266e564dSmrg    {
124266e564dSmrg	p->auth_names = NULL;
125266e564dSmrg	p->auth_procs = NULL;
126266e564dSmrg    }
127266e564dSmrg
128266e564dSmrg    p->io_error_proc = IOErrorProc;
129266e564dSmrg
130266e564dSmrg    return (opcodeRet);
131266e564dSmrg}
132266e564dSmrg
133266e564dSmrg
134266e564dSmrg
135266e564dSmrgint
136266e564dSmrgIceRegisterForProtocolReply (protocolName, vendor, release,
137266e564dSmrg    versionCount, versionRecs, authCount, authNames, authProcs,
138266e564dSmrg    hostBasedAuthProc, protocolSetupProc, protocolActivateProc,
139266e564dSmrg    IOErrorProc)
140266e564dSmrg
141266e564dSmrgchar				*protocolName;
142266e564dSmrgchar				*vendor;
143266e564dSmrgchar				*release;
144266e564dSmrgint				versionCount;
145266e564dSmrgIcePaVersionRec			*versionRecs;
146266e564dSmrgint				authCount;
147266e564dSmrgchar				**authNames;
148266e564dSmrgIcePaAuthProc			*authProcs;
149266e564dSmrgIceHostBasedAuthProc		hostBasedAuthProc;
150266e564dSmrgIceProtocolSetupProc		protocolSetupProc;
151266e564dSmrgIceProtocolActivateProc		protocolActivateProc;
152266e564dSmrgIceIOErrorProc			IOErrorProc;
153266e564dSmrg
154266e564dSmrg{
155266e564dSmrg    _IcePaProtocol 	*p;
156266e564dSmrg    int			opcodeRet, i;
157266e564dSmrg
158266e564dSmrg    for (i = 1; i <= _IceLastMajorOpcode; i++)
159266e564dSmrg	if (strcmp (protocolName, _IceProtocols[i - 1].protocol_name) == 0)
160266e564dSmrg	{
161266e564dSmrg	    if (_IceProtocols[i - 1].accept_client != NULL)
162266e564dSmrg	    {
163266e564dSmrg		/*
164266e564dSmrg		 * We've already registered this protocol.
165266e564dSmrg		 */
166266e564dSmrg
167266e564dSmrg		return (i);
168266e564dSmrg	    }
169266e564dSmrg	    else
170266e564dSmrg	    {
171266e564dSmrg		break;
172266e564dSmrg	    }
173266e564dSmrg	}
174266e564dSmrg
175266e564dSmrg
176266e564dSmrg    if (i <= _IceLastMajorOpcode)
177266e564dSmrg    {
178266e564dSmrg	p = _IceProtocols[i - 1].accept_client =
179266e564dSmrg	    (_IcePaProtocol *) malloc (sizeof (_IcePaProtocol));
180266e564dSmrg	opcodeRet = i;
181266e564dSmrg    }
182266e564dSmrg    else if (_IceLastMajorOpcode == 255 ||
183266e564dSmrg	versionCount < 1 ||
184266e564dSmrg	strlen (protocolName) == 0)
185266e564dSmrg    {
186266e564dSmrg	return (-1);
187266e564dSmrg    }
188266e564dSmrg    else
189266e564dSmrg    {
190266e564dSmrg	char *name;
191266e564dSmrg
192266e564dSmrg	_IceProtocols[_IceLastMajorOpcode].protocol_name = name =
193266e564dSmrg	    strdup(protocolName);
194266e564dSmrg
195266e564dSmrg	_IceProtocols[_IceLastMajorOpcode].orig_client = NULL;
196266e564dSmrg
197266e564dSmrg	p = _IceProtocols[_IceLastMajorOpcode].accept_client =
198266e564dSmrg	    (_IcePaProtocol *) malloc (sizeof (_IcePaProtocol));
199266e564dSmrg
200266e564dSmrg	opcodeRet = ++_IceLastMajorOpcode;
201266e564dSmrg    }
202266e564dSmrg
203266e564dSmrg    p->vendor = strdup(vendor);
204266e564dSmrg    p->release = strdup(release);
205266e564dSmrg
206266e564dSmrg    p->version_count = versionCount;
207266e564dSmrg
208266e564dSmrg    p->version_recs = (IcePaVersionRec *) malloc (
209266e564dSmrg	versionCount * sizeof (IcePaVersionRec));
210266e564dSmrg    memcpy (p->version_recs, versionRecs,
211266e564dSmrg	versionCount * sizeof (IcePaVersionRec));
212266e564dSmrg
213266e564dSmrg    p->protocol_setup_proc = protocolSetupProc;
214266e564dSmrg    p->protocol_activate_proc = protocolActivateProc;
215266e564dSmrg
216266e564dSmrg    if ((p->auth_count = authCount) > 0)
217266e564dSmrg    {
218266e564dSmrg	p->auth_names = (char **) malloc (
219266e564dSmrg	    authCount * sizeof (char *));
220266e564dSmrg
221266e564dSmrg	p->auth_procs = (IcePaAuthProc *) malloc (
222266e564dSmrg	    authCount * sizeof (IcePaAuthProc));
223266e564dSmrg
224266e564dSmrg	for (i = 0; i < authCount; i++)
225266e564dSmrg	{
226266e564dSmrg	    p->auth_names[i] = strdup(authNames[i]);
227266e564dSmrg	    p->auth_procs[i] = authProcs[i];
228266e564dSmrg	}
229266e564dSmrg    }
230266e564dSmrg    else
231266e564dSmrg    {
232266e564dSmrg	p->auth_names = NULL;
233266e564dSmrg	p->auth_procs = NULL;
234266e564dSmrg    }
235266e564dSmrg
236266e564dSmrg    p->host_based_auth_proc = hostBasedAuthProc;
237266e564dSmrg
238266e564dSmrg    p->io_error_proc = IOErrorProc;
239266e564dSmrg
240266e564dSmrg    return (opcodeRet);
241266e564dSmrg}
242266e564dSmrg
243