2 * Copyright (C) 2006 by Latchesar Ionkov <lucho@ionkov.net>
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * LATCHESAR IONKOV AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
31 sp_fidpool_create(void)
35 return calloc(FID_HTABLE_SIZE
, sizeof(*ret
));
39 sp_fidpool_destroy(Spfid
**pool
)
45 for(i
= 0; i
< FID_HTABLE_SIZE
; i
++) {
50 if (f
->type
&Qtauth
&& srv
->auth
&& srv
->auth
->clunk
)
51 (*srv
->auth
->clunk
)(f
);
52 else if (!(f
->type
&Qtauth
) && srv
->fiddestroy
)
53 (*srv
->fiddestroy
)(f
);
63 sp_fid_find(Spconn
*conn
, u32 fid
)
66 Spfid
**htable
, *f
, **prevp
;
68 hash
= fid
% FID_HTABLE_SIZE
;
69 htable
= conn
->fidpool
;
73 prevp
= &htable
[hash
];
78 f
->next
= htable
[hash
];
90 sp_fid_create(Spconn
*conn
, u32 fid
, void *aux
)
95 hash
= fid
% FID_HTABLE_SIZE
;
96 htable
= conn
->fidpool
;
100 f
= sp_fid_find(conn
, fid
);
104 f
= sp_malloc(sizeof(*f
));
117 f
->next
= htable
[hash
];
124 sp_fid_destroy(Spfid
*fid
)
129 Spfid
**htable
, *f
, **prevp
;
132 hash
= fid
->fid
% FID_HTABLE_SIZE
;
133 htable
= conn
->fidpool
;
137 prevp
= &htable
[hash
];
140 if (f
->fid
== fid
->fid
) {
143 if (f
->type
& Qtauth
&& srv
->auth
&& srv
->auth
->clunk
)
144 (*srv
->auth
->clunk
)(f
);
145 else if (!(f
->type
&Qtauth
) && srv
->fiddestroy
)
146 (*srv
->fiddestroy
)(f
);
149 sp_user_decref(f
->user
);
162 sp_fid_incref(Spfid
*fid
)
171 sp_fid_decref(Spfid
*fid
)