1/* 2 * Copyright (c) 1995 3 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 24 unchanged lines hidden (view full) --- 33#include <stdio.h> 34#include <stdlib.h> 35#include <string.h> 36#include <sys/types.h> 37#include "hash.h" 38 39#ifndef lint 40static const char rcsid[] = |
41 "$FreeBSD: head/libexec/mknetid/hash.c 90779 2002-02-17 19:09:20Z imp $"; |
42#endif /* not lint */ 43 44/* 45 * This hash function is stolen directly from the 46 * Berkeley DB package. It already exists inside libc, but 47 * it's declared static which prevents us from calling it 48 * from here. 49 */ 50/* 51 * OZ's original sdbm hash 52 */ 53u_int32_t |
54hash(const void *keyarg, size_t len) |
55{ |
56 const u_char *key; 57 size_t loop; 58 u_int32_t h; |
59 60#define HASHC h = *key++ + 65599 * h 61 62 h = 0; 63 key = keyarg; 64 if (len > 0) { 65 loop = (len + 8 - 1) >> 3; 66 --- 28 unchanged lines hidden (view full) --- 95 return (h); 96} 97 98/* 99 * Generate a hash value for a given key (character string). 100 * We mask off all but the lower 8 bits since our table array 101 * can only hole 256 elements. 102 */ |
103u_int32_t hashkey(char *key) |
104{ 105 106 if (key == NULL) 107 return (-1); 108 return(hash((void *)key, strlen(key)) & HASH_MASK); 109} 110 111/* Find an entry in the hash table (may be hanging off a linked list). */ |
112struct grouplist *lookup(struct member_entry *table[], char *key) |
113{ 114 struct member_entry *cur; 115 116 cur = table[hashkey(key)]; 117 118 while (cur) { 119 if (!strcmp(cur->key, key)) 120 return(cur->groups); 121 cur = cur->next; 122 } 123 124 return(NULL); 125} 126 127struct grouplist dummy = { 99999, NULL }; 128 129/* 130 * Store an group member entry and/or update its grouplist. 131 */ |
132void mstore (struct member_entry *table[], char *key, int gid, int dup) |
133{ 134 struct member_entry *cur, *new; 135 struct grouplist *tmp; 136 u_int32_t i; 137 138 i = hashkey(key); 139 cur = table[i]; 140 --- 28 unchanged lines hidden --- |