1 #pragma ident "%Z%%M% %I% %E% SMI" 2 3 /* 4 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 5 * 6 * Openvision retains the copyright to derivative works of 7 * this source code. Do *NOT* create a derivative of this 8 * source code before consulting with your legal department. 9 * Do *NOT* integrate *ANY* of this source code into another 10 * product before consulting with your legal department. 11 * 12 * For further information, read the top-level Openvision 13 * copyright which is contained in the top-level MIT Kerberos 14 * copyright. 15 * 16 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 17 * 18 */ 19 20 21 /* 22 * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved 23 * 24 * $Header: /afs/athena.mit.edu/astaff/project/krbdev/.cvsroot/src/lib/kadm5/srv/server_dict.c,v 1.2 1996/10/18 19:45:52 bjaspan Exp $ 25 */ 26 27 #if !defined(lint) && !defined(__CODECENTER__) 28 static char *rcsid = "$Header: /afs/athena.mit.edu/astaff/project/krbdev/.cvsroot/src/lib/kadm5/srv/server_dict.c,v 1.2 1996/10/18 19:45:52 bjaspan Exp $"; 29 #endif 30 31 #include <sys/types.h> 32 #include <sys/file.h> 33 #include <fcntl.h> 34 #include <sys/stat.h> 35 #include <unistd.h> 36 #include <kadm5/admin.h> 37 #include <stdlib.h> 38 #include <stdio.h> 39 #include <string.h> 40 #include <memory.h> 41 #include <syslog.h> 42 #include <libintl.h> 43 #include "server_internal.h" 44 45 static char **word_list = NULL; /* list of word pointers */ 46 static char *word_block = NULL; /* actual word data */ 47 static int word_count = 0; /* number of words */ 48 extern int errno; 49 50 /* 51 * Function: word_compare 52 * 53 * Purpose: compare two words in the dictionary. 54 * 55 * Arguments: 56 * w1 (input) pointer to first word 57 * w2 (input) pointer to second word 58 * <return value> result of strcmp 59 * 60 * Requires: 61 * w1 and w2 to point to valid memory 62 * 63 */ 64 65 static int 66 word_compare(const void *s1, const void *s2) 67 { 68 return (strcasecmp(*(char **)s1, *(char **)s2)); 69 } 70 71 /* 72 * Function: init-dict 73 * 74 * Purpose: Initialize in memory word dictionary 75 * 76 * Arguments: 77 * none 78 * <return value> KADM5_OK on sucsess errno on failure; 79 * (but success on ENOENT) 80 * 81 * Requires: 82 * If WORDFILE exists, it must contain a list of words, 83 * one word per-line. 84 * 85 * Effects: 86 * If WORDFILE exists, it is read into memory sorted for future 87 * use. If it does not exist, it syslogs an error message and returns 88 * success. 89 * 90 * Modifies: 91 * word_list to point to a chunck of allocated memory containing 92 * pointers to words 93 * word_block to contain the dictionary. 94 * 95 */ 96 97 int init_dict(kadm5_config_params *params) 98 { 99 int fd, 100 len, 101 i; 102 char *p, 103 *t; 104 struct stat sb; 105 106 if(word_list != NULL && word_block != NULL) 107 return KADM5_OK; 108 if (! (params->mask & KADM5_CONFIG_DICT_FILE)) { 109 syslog(LOG_INFO, 110 dgettext(TEXT_DOMAIN, 111 "No dictionary file specified, continuing " 112 "without one.")); 113 return KADM5_OK; 114 } 115 if ((fd = open(params->dict_file, O_RDONLY)) == -1) { 116 if (errno == ENOENT) { 117 syslog(LOG_ERR, 118 dgettext(TEXT_DOMAIN, 119 "WARNING! Cannot find dictionary file %s, " 120 "continuing without one."), params->dict_file); 121 return KADM5_OK; 122 } else 123 return errno; 124 } 125 if (fstat(fd, &sb) == -1) 126 return errno; 127 if ((word_block = (char *) malloc(sb.st_size + 1)) == NULL) 128 return errno; 129 if (read(fd, word_block, sb.st_size) != sb.st_size) 130 return errno; 131 (void) close(fd); 132 word_block[sb.st_size] = '\0'; 133 134 p = word_block; 135 len = sb.st_size; 136 while(len > 0 && (t = memchr(p, '\n', len)) != NULL) { 137 *t = '\0'; 138 len -= t - p + 1; 139 p = t + 1; 140 word_count++; 141 } 142 if ((word_list = (char **) malloc(word_count * sizeof(char *))) == NULL) 143 return errno; 144 p = word_block; 145 for (i = 0; i < word_count; i++) { 146 word_list[i] = p; 147 p += strlen(p) + 1; 148 } 149 qsort(word_list, word_count, sizeof(char *), word_compare); 150 return KADM5_OK; 151 } 152 153 /* 154 * Function: find_word 155 * 156 * Purpose: See if the specified word exists in the in-core dictionary 157 * 158 * Arguments: 159 * word (input) word to search for. 160 * <return value> WORD_NOT_FOUND if not in dictionary, 161 * KADM5_OK if if found word 162 * errno if init needs to be called and returns an 163 * error 164 * 165 * Requires: 166 * word to be a null terminated string. 167 * That word_list and word_block besetup 168 * 169 * Effects: 170 * finds word in dictionary. 171 * Modifies: 172 * nothing. 173 * 174 */ 175 176 int 177 find_word(const char *word) 178 { 179 char **value; 180 181 if(word_list == NULL || word_block == NULL) 182 return WORD_NOT_FOUND; 183 if ((value = (char **) bsearch(&word, word_list, word_count, sizeof(char *), 184 word_compare)) == NULL) 185 return WORD_NOT_FOUND; 186 else 187 return KADM5_OK; 188 } 189 190 /* 191 * Function: destroy_dict 192 * 193 * Purpose: destroy in-core copy of dictionary. 194 * 195 * Arguments: 196 * none 197 * <return value> none 198 * Requires: 199 * nothing 200 * Effects: 201 * frees up memory occupied by word_list and word_block 202 * sets count back to 0, and resets the pointers to NULL 203 * 204 * Modifies: 205 * word_list, word_block, and word_count. 206 * 207 */ 208 209 void 210 destroy_dict(void) 211 { 212 if(word_list) { 213 free(word_list); 214 word_list = NULL; 215 } 216 if(word_block) { 217 free(word_block); 218 word_block = NULL; 219 } 220 if(word_count) 221 word_count = 0; 222 return; 223 } 224