| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- #ident "ldclt @(#)utils.c 1.4 01/01/11"
- /** BEGIN COPYRIGHT BLOCK
- * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
- * Copyright (C) 2006 Red Hat, Inc.
- * All rights reserved.
- *
- * License: GPL (version 3 or any later version).
- * See LICENSE for details.
- * END COPYRIGHT BLOCK **/
- #ifdef HAVE_CONFIG_H
- # include <config.h>
- #endif
- /*
- FILE : utils.c
- AUTHOR : Jean-Luc SCHWING
- VERSION : 1.0
- DATE : 14 November 2000
- DESCRIPTION :
- This file contains the utilities functions that will be
- used as well by ldclt and by the genldif command, e.g.
- the random generator functions, etc...
- The main target/reason for creating this file is to be
- able to easely separate these functions from ldclt's
- framework and data structures, and thus to provide a
- kind of library suitable for any command.
- LOCAL : None.
- */
- #include "utils.h" /* Basic definitions for this file */
- #include <stdio.h> /* sprintf(), etc... */
- #include <stdlib.h> /* lrand48(), etc... */
- #include <ctype.h> /* isascii(), etc... */ /*JLS 16-11-00*/
- #include <string.h> /* strerror(), etc... */ /*JLS 14-11-00*/
- /*
- * Some global variables...
- */
- #define ldcltrand48() lrand48()
- /* ****************************************************************************
- FUNCTION : utilsInit
- PURPOSE : Initiates the utilities functions.
- INPUT : None.
- OUTPUT : None.
- RETURN : -1 if error, 0 else.
- DESCRIPTION :
- *****************************************************************************/
- int
- utilsInit (void)
- {
- /*
- * No error
- */
- return (0);
- }
- /* ****************************************************************************
- FUNCTION : rndlim
- PURPOSE : Returns a random number between the given limits.
- INPUT : low = low limit
- high = high limit
- OUTPUT : None.
- RETURN : The random value.
- DESCRIPTION :
- *****************************************************************************/
- int
- rndlim (
- int low,
- int high)
- {
- return (low + ldcltrand48() % (high-low+1));
- }
- /* ****************************************************************************
- FUNCTION : rnd
- PURPOSE : Creates a random number string between the given
- arguments. The string is returned in the buffer.
- INPUT : low = low limit
- high = high limit
- ndigits = number of digits - 0 means no zero pad
- OUTPUT : buf = buffer to write the random string. Note that
- it is generated with fixed number of digits,
- completed with leading '0', if ndigits > 0
- RETURN : None.
- DESCRIPTION :
- *****************************************************************************/
- void
- rnd (
- char *buf,
- int low,
- int high,
- int ndigits)
- {
- sprintf (buf, "%0*d", ndigits,
- (int)(low + (ldcltrand48() % (high-low+1)))); /*JLS 14-11-00*/
- }
- /* ****************************************************************************
- FUNCTION : rndstr
- PURPOSE : Return a random string, of length ndigits. The string
- is returned in the buf.
- INPUT : ndigits = number of digits required.
- OUTPUT : buf = the buf must be long enough to contain the
- requested string.
- RETURN : None.
- DESCRIPTION :
- *****************************************************************************/
- void
- rndstr (
- char *buf,
- int ndigits)
- {
- unsigned int rndNum; /* The random value */
- int charNum; /* Random char in buf */
- int byteNum; /* Byte in rndNum */
- char newChar; /* The new byte as a char */
- char *rndArray; /* To cast the rndNum into chars */
- charNum = 0;
- byteNum = 4;
- rndArray = (char *)(&rndNum);
- while (charNum < ndigits)
- {
- /*
- * Maybe we should generate a new random number ?
- */
- if (byteNum == 4)
- {
- rndNum = ldcltrand48(); /*JLS 14-11-00*/
- byteNum = 0;
- }
- /*
- * Is it a valid char ?
- */
- newChar = rndArray[byteNum];
- /*
- * The last char must not be a '\' nor a space.
- */
- if (!(((charNum+1) == ndigits) &&
- ((newChar == '\\') || (newChar == ' '))))
- {
- /*
- * First, there are some special characters that have a meaning for
- * LDAP, and thus that must be quoted. What LDAP's rfc1779 means by
- * "to quote" may be translated by "to antislash"
- * Note: we do not check the \ because in this way, it leads to randomly
- * quote some valid characters.
- */
- if ((newChar == '=') || (newChar == ';') || (newChar == ',') ||
- (newChar == '+') || (newChar == '"') || (newChar == '<') ||
- (newChar == '>') || (newChar == '#'))
- {
- /*
- * Ensure that the previous char is *not* a \ otherwise
- * it will result in a \\, rather than a \,
- * If it is the case, add one more \ to have \\\,
- */
- if ((charNum > 0) && (buf[charNum-1] == '\\'))
- {
- if ((charNum+3) < ndigits)
- {
- buf[charNum++] = '\\';
- buf[charNum++] = '\\';
- buf[charNum++] = newChar;
- }
- }
- else
- {
- if ((charNum+2) < ndigits)
- {
- buf[charNum++] = '\\';
- buf[charNum++] = newChar;
- }
- }
- }
- else
- {
- /*
- * strict ascii required
- */
- if (isascii (newChar) && !iscntrl(newChar))
- buf[charNum++] = newChar;
- }
- }
- /*
- * Next byte of the random value.
- */
- byteNum++;
- }
- /*
- * End of function
- */
- buf[charNum] = '\0';
- }
- /* increment val - if val > max, wrap value around to start over at min */
- /* the range is max - min + 1 = number of possible values */
- /* the new value is (((val + incr) - min) % range) + min */
- int
- incr_and_wrap(int val, int min, int max, int incr)
- {
- int range = max - min + 1;
- return (((val + incr) - min) % range) + min;
- }
|