1 /* 2 * Copyright (c) International Business Machines Corp., 2001-2004 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 12 * the GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 #ifndef _MTINT_H_ 19 #define _MTINT_H_ 20 21 #include "config.h" 22 23 #include <stdlib.h> 24 #include <sys/types.h> 25 #include <inttypes.h> 26 27 /* A guess of how many random bytes (not bits) */ 28 /* will be consumed per iteration */ 29 /* This is multiplied by the iteration count */ 30 /* to get the size of the array in init_random() */ 31 #define AVG_ITR_RNDBTS 2 32 33 /* Set a cap on the size of the array, note this */ 34 /* is multiplied by AVG_ITR_RNDBTS */ 35 #define MAX_RANDBUF_SIZE (10 * 1024) 36 37 #define MIN_RANDBUF_SIZE 1024 38 39 40 typedef struct randdata { 41 int size; 42 uint8_t *mt; /* the array of random bits */ 43 int mti; /* mti==N+1 means mt[N] is not initialized */ 44 45 /* fallback random source, lrand48_r() */ 46 #ifdef HAVE_LRAND48_R 47 struct drand48_data data; 48 #endif 49 } randdata_t; 50 51 uint32_t getrandom(randdata_t *rd, uint32_t mod); 52 uint64_t getllrandom(randdata_t *rd, uint64_t mod); 53 54 /* pass in thread-local state, and est. number of "uses" */ 55 /* pass in 0 for size if size is unknown/not important */ 56 void init_random(randdata_t *state, uint32_t size); 57 void destroy_random(randdata_t *rd); 58 void randcleanup(void); 59 60 #endif 61