]>
Commit | Line | Data |
---|---|---|
32abdb71 | 1 | /* Copyright (c) 1997, 1998, 1999 Free Software Foundation, Inc. |
2d7da676 | 2 | This file is part of the GNU C Library. |
32abdb71 | 3 | Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997. |
2d7da676 UD |
4 | |
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Library General Public License as | |
7 | published by the Free Software Foundation; either version 2 of the | |
8 | License, or (at your option) any later version. | |
9 | ||
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Library General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Library General Public | |
16 | License along with the GNU C Library; see the file COPYING.LIB. If not, | |
17 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
18 | Boston, MA 02111-1307, USA. */ | |
19 | ||
20 | #include <string.h> | |
21 | #include <rpcsvc/nis.h> | |
91eee4dd UD |
22 | |
23 | #include "nis_xdr.h" | |
2d7da676 UD |
24 | #include "nis_intern.h" |
25 | ||
26 | fd_result * | |
27 | __nis_finddirectory (directory_obj *dir, const_nis_name name) | |
28 | { | |
3996f34b | 29 | nis_error status; |
2d7da676 UD |
30 | fd_args fd_args; |
31 | fd_result *fd_res; | |
32 | ||
32abdb71 | 33 | fd_args.dir_name = (char *)name; |
2d7da676 UD |
34 | fd_args.requester = nis_local_host(); |
35 | fd_res = calloc (1, sizeof (fd_result)); | |
32abdb71 UD |
36 | if (fd_res == NULL) |
37 | return NULL; | |
650425ce | 38 | |
ac9f45cf UD |
39 | status = __do_niscall2 (dir->do_servers.do_servers_val, |
40 | dir->do_servers.do_servers_len, | |
91eee4dd UD |
41 | NIS_FINDDIRECTORY, (xdrproc_t) _xdr_fd_args, |
42 | (caddr_t) &fd_args, (xdrproc_t) _xdr_fd_result, | |
e852e889 | 43 | (caddr_t) fd_res, NO_AUTHINFO|USE_DGRAM, NULL); |
ac9f45cf | 44 | if (status != NIS_SUCCESS) |
3996f34b | 45 | fd_res->status = status; |
650425ce | 46 | |
2d7da676 UD |
47 | return fd_res; |
48 | } | |
49 | ||
50 | /* This is from libc/db/hash/hash_func.c, hash3 is static there */ | |
51 | /* | |
52 | * This is INCREDIBLY ugly, but fast. We break the string up into 8 byte | |
53 | * units. On the first time through the loop we get the "leftover bytes" | |
54 | * (strlen % 8). On every other iteration, we perform 8 HASHC's so we handle | |
55 | * all 8 bytes. Essentially, this saves us 7 cmp & branch instructions. If | |
56 | * this routine is heavily used enough, it's worth the ugly coding. | |
57 | * | |
58 | * OZ's original sdbm hash | |
59 | */ | |
a1129917 | 60 | uint32_t |
2d7da676 UD |
61 | __nis_hash (const void *keyarg, register size_t len) |
62 | { | |
63 | register const u_char *key; | |
64 | register size_t loop; | |
a1129917 | 65 | register uint32_t h; |
650425ce | 66 | |
2d7da676 | 67 | #define HASHC h = *key++ + 65599 * h |
650425ce | 68 | |
2d7da676 UD |
69 | h = 0; |
70 | key = keyarg; | |
650425ce | 71 | if (len > 0) |
2d7da676 UD |
72 | { |
73 | loop = (len + 8 - 1) >> 3; | |
650425ce | 74 | switch (len & (8 - 1)) |
2d7da676 UD |
75 | { |
76 | case 0: | |
77 | do { | |
78 | HASHC; | |
79 | /* FALLTHROUGH */ | |
80 | case 7: | |
81 | HASHC; | |
82 | /* FALLTHROUGH */ | |
83 | case 6: | |
84 | HASHC; | |
85 | /* FALLTHROUGH */ | |
86 | case 5: | |
87 | HASHC; | |
88 | /* FALLTHROUGH */ | |
89 | case 4: | |
90 | HASHC; | |
91 | /* FALLTHROUGH */ | |
92 | case 3: | |
93 | HASHC; | |
94 | /* FALLTHROUGH */ | |
95 | case 2: | |
96 | HASHC; | |
97 | /* FALLTHROUGH */ | |
98 | case 1: | |
99 | HASHC; | |
100 | } while (--loop); | |
101 | } | |
102 | } | |
103 | return (h); | |
104 | } |