1/*
2 * Copyright (c) 2010 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1.  Redistributions of source code must retain the above copyright
11 *     notice, this list of conditions and the following disclaimer.
12 * 2.  Redistributions in binary form must reproduce the above copyright
13 *     notice, this list of conditions and the following disclaimer in the
14 *     documentation and/or other materials provided with the distribution.
15 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of its
16 *     contributors may be used to endorse or promote products derived from
17 *     this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * Portions of this software have been released under the following terms:
31 *
32 * (c) Copyright 1989-1993 OPEN SOFTWARE FOUNDATION, INC.
33 * (c) Copyright 1989-1993 HEWLETT-PACKARD COMPANY
34 * (c) Copyright 1989-1993 DIGITAL EQUIPMENT CORPORATION
35 *
36 * To anyone who acknowledges that this file is provided "AS IS"
37 * without any express or implied warranty:
38 * permission to use, copy, modify, and distribute this file for any
39 * purpose is hereby granted without fee, provided that the above
40 * copyright notices and this notice appears in all source code copies,
41 * and that none of the names of Open Software Foundation, Inc., Hewlett-
42 * Packard Company or Digital Equipment Corporation be used
43 * in advertising or publicity pertaining to distribution of the software
44 * without specific, written prior permission.  Neither Open Software
45 * Foundation, Inc., Hewlett-Packard Company nor Digital
46 * Equipment Corporation makes any representations about the suitability
47 * of this software for any purpose.
48 *
49 * Copyright (c) 2007, Novell, Inc. All rights reserved.
50 * Redistribution and use in source and binary forms, with or without
51 * modification, are permitted provided that the following conditions
52 * are met:
53 *
54 * 1.  Redistributions of source code must retain the above copyright
55 *     notice, this list of conditions and the following disclaimer.
56 * 2.  Redistributions in binary form must reproduce the above copyright
57 *     notice, this list of conditions and the following disclaimer in the
58 *     documentation and/or other materials provided with the distribution.
59 * 3.  Neither the name of Novell Inc. nor the names of its contributors
60 *     may be used to endorse or promote products derived from this
61 *     this software without specific prior written permission.
62 *
63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
64 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
65 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY
67 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
68 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
69 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
70 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
71 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
72 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
73 *
74 * @APPLE_LICENSE_HEADER_END@
75 */
76
77/*
78**
79**  NAME
80**
81**      cnid.c
82**
83**  FACILITY:
84**
85**      Remote Procedure Call (RPC)
86**
87**  ABSTRACT:
88**
89**  The Local Identifier Service.
90**
91**
92*/
93
94#include <commonp.h>    /* Common declarations for all RPC runtime */
95#include <com.h>        /* Common communications services */
96#include <comprot.h>    /* Common protocol services */
97#include <cnp.h>        /* NCA Connection private declarations */
98#include <cnid.h>
99
100/*
101 * INTERNAL variables.
102 */
103
104INTERNAL unsigned16     seqnum;
105
106/***********************************************************************/
107
108
109/*
110**++
111**
112**  ROUTINE NAME:       rpc__cn_init_seqnum
113**
114**  SCOPE:              PRIVATE - declared in cnid.h
115**
116**  DESCRIPTION:
117**
118**
119**  This routine initializes the global sequence number cell and
120**  corresponding mutex.
121**
122**  A sequence number generated by extracting the lower sixteen bits
123**  of system time in seconds.
124**
125**  INPUTS:             none
126**
127**  INPUTS/OUTPUTS:     none
128**
129**  OUTPUTS:            none
130**
131**  IMPLICIT INPUTS:    none
132**
133**  The system time.
134**
135**  IMPLICIT OUTPUTS:   none
136**
137**  The static variable seqnum will contain the lower 16
138**  bits of the system time in seconds.
139**
140**  FUNCTION VALUE:     none
141**
142**  SIDE EFFECTS:       none
143**
144**
145**
146**
147**--
148**/
149
150PRIVATE void rpc__cn_init_seqnum (void)
151
152{
153
154    /*
155     * Determine the system time in seconds via the time() C runtime library
156     * call. Use the lower 16 bits of this for the sequence number.
157     */
158    seqnum = ((unsigned32) time (NULL)) & 0xffff;
159}
160
161
162/*
163**++
164**
165**  ROUTINE NAME:       rpc__cn_gen_local_id
166**
167**  SCOPE:              PRIVATE - declared in cnid.h
168**
169**  DESCRIPTION:
170**
171**  This routine creates a new local identifier. The index portion
172**  of the identifier is taken from the index argument passed by the
173**  caller.
174**
175**  INPUTS:
176**
177**      index           Index value to be stored in the local
178**                      identifier being created.
179**
180**  INPUTS/OUTPUTS:     none
181**
182**  OUTPUTS:
183**
184**      lcl_id          The created local identifier.
185**
186**  IMPLICIT INPUTS:    none
187**
188**  IMPLICIT OUTPUTS:   none
189**
190**  FUNCTION VALUE:     none
191**
192**  SIDE EFFECTS:
193**
194**  The sequence number is incremented.
195**
196**--
197**/
198
199PRIVATE void rpc__cn_gen_local_id
200(
201    unsigned32              index,
202    rpc_cn_local_id_t       *lcl_id
203)
204{
205
206    /*
207     * Increment it so that the local id being generated will be different that
208     * the last.
209     */
210    seqnum++;
211
212    /*
213     * Since zero is defined as being an invalid local id we never want to
214     * generate a local id with a sequence number part of zero (since the index
215     * given may be zero.
216     */
217    if (seqnum == 0)
218    {
219        seqnum = 1;
220    }
221
222    /*
223     * Copy the sequence number into the returned local id.
224     */
225    lcl_id->parts.id_seqnum = seqnum;
226
227    /*
228     * Put the caller provided index into the returned local id.
229     */
230    lcl_id->parts.id_index = (unsigned16) index;
231}
232