1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
|
/** BEGIN COPYRIGHT BLOCK
* Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
* Copyright (C) 2005 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
/* uniqueidgen.c - implementation for uniqueID generator */
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
/* What platforms actually need this? */
#ifdef HAVE_SYS_SYSINFO_H
#include <sys/sysinfo.h>
#endif
#include <sys/utsname.h>
#include "nspr.h"
#include "slap.h"
#include "uuid.h"
#define MODULE "uniqueid generator"
/* converts from guid -> UniqueID */
/* static void uuid2UniqueID (const guid_t *uuid, Slapi_UniqueID *uId); */
/* converts from UniqueID -> guid */
/* static void uniqueID2uuid (const Slapi_UniqueID *uId, guid_t *uuid); */
/* validates directory */
static int validDir(const char *configDir);
/* Function: uniqueIDGenInit
Description: this function initializes the generator
Parameters: configDir - directory in which generators state is stored
configDN - DIT entry with state information
mtGen - indicates whether multiple threads will use generator
Return: UID_SUCCESS if function succeeds
UID_BADDATA if invalif directory is passed
UID_SYSTEM_ERROR if any other failure occurs
*/
int
uniqueIDGenInit(const char *configDir, const Slapi_DN *configDN, PRBool mtGen)
{
int rt;
if ((configDN == NULL && (configDir == NULL || !validDir(configDir))) ||
(configDN && configDir)) {
slapi_log_err(SLAPI_LOG_ERR, MODULE, "uniqueIDGenInit: invalid arguments\n");
return UID_BADDATA;
}
rt = uuid_init(configDir, configDN, mtGen);
if (rt == UUID_SUCCESS)
return UID_SUCCESS;
else {
slapi_log_err(SLAPI_LOG_ERR, MODULE, "uniqueIDGenInit: "
"generator initialization failed\n");
return UID_SYSTEM_ERROR;
}
}
/* Function: uniqueIDGenCleanup
Description: cleanup
Parameters: none
Return: none
*/
void
uniqueIDGenCleanup()
{
uuid_cleanup();
}
/* Function: slapi_uniqueIDGenerate
Description: this function generates UniqueID; exposed to the plugins.
Parameters: uId - structure in which new id will be return
Return: UID_SUCCESS, if operation is successful
UID_BADDATA, if null pointer is passed to the function
UID_SYSTEM_ERROR, if update to persistent storage failed
*/
int
slapi_uniqueIDGenerate(Slapi_UniqueID *uId)
{
int rt;
if (uId == NULL) {
slapi_log_err(SLAPI_LOG_ERR, MODULE, "uniqueIDGenerate: "
"NULL parameter is passed to the function.\n");
return UID_BADDATA;
}
rt = uuid_create(uId);
if (rt != UUID_SUCCESS) {
slapi_log_err(SLAPI_LOG_ERR, MODULE, "uniqueIDGenerate: "
"id generation failed.\n");
return UID_SYSTEM_ERROR;
}
return UID_SUCCESS;
}
/* Function: slapi_uniqueIDGenerateString
Description: this function generates uniqueid an returns it as a string
This function returns the data in the format generated by
slapi_uniqueIDFormat.
Parameters: uId - buffer to receive the ID. Caller is responsible for
freeing uId buffer.
Return: UID_SUCCESS if function succeeds;
UID_BADDATA if invalid pointer passed to the function;
UID_MEMORY_ERROR if malloc fails;
UID_SYSTEM_ERROR update to persistent storage failed.
*/
int
slapi_uniqueIDGenerateString(char **uId)
{
Slapi_UniqueID uIdTemp;
int rc;
rc = slapi_uniqueIDGenerate(&uIdTemp);
if (rc != UID_SUCCESS)
return rc;
rc = slapi_uniqueIDFormat(&uIdTemp, uId);
return rc;
}
/* Function: slapi_uniqueIDGenerateFromName
Description: this function generates an id from name. See uuid
draft for more details. This function is thread safe.
Parameters: uId - generated id
uIDBase - uid used for generation to distinguish different
name - buffer containing name from which to generate the id
namelen - length of the name buffer
name spaces
Return: UID_SUCCESS if function succeeds
UID_BADDATA if invalid argument is passed to the
function.
*/
int
slapi_uniqueIDGenerateFromName(Slapi_UniqueID *uId, const Slapi_UniqueID *uIdBase, const void *name, int namelen)
{
if (uId == NULL || uIdBase == NULL || name == NULL || namelen <= 0) {
slapi_log_err(SLAPI_LOG_ERR, MODULE, "uniqueIDGenerateMT: "
"invalid parameter is passed to the function.\n");
return UID_BADDATA;
}
uuid_create_from_name(uId, *uIdBase, name, namelen);
return UID_SUCCESS;
}
/* Function: slapi_uniqueIDGenerateFromName
Description: this function generates an id from a name and returns
it in the string format. See uuid draft for more
details. This function can be used in both a
singlethreaded and a multithreaded environments.
Parameters: uId - generated id in string form
uIDBase - uid used for generation to distinguish among
different name spaces in string form; NULL means to use
empty id as the base.
name - buffer containing name from which to generate the id
namelen - length of the name buffer
Return: UID_SUCCESS if function succeeds
UID_BADDATA if invalid argument is passed to the
function.
*/
int
slapi_uniqueIDGenerateFromNameString(char **uId,
const char *uIdBase,
const void *name,
int namelen)
{
int rc;
Slapi_UniqueID idBase = {0};
Slapi_UniqueID idGen = {0};
/* just use Id of all 0 as base id */
if (uIdBase != NULL) {
rc = slapi_uniqueIDScan(&idBase, uIdBase);
if (rc != UID_SUCCESS) {
return rc;
}
}
rc = slapi_uniqueIDGenerateFromName(&idGen, &idBase, name, namelen);
if (rc != UID_SUCCESS) {
return rc;
}
rc = slapi_uniqueIDFormat(&idGen, uId);
return rc;
}
/* helper fumctions */
static int
validDir(const char *configDir)
{
PRDir *dir;
/* empty string means this directory */
if (strlen(configDir) == 0)
return 1;
dir = PR_OpenDir(configDir);
if (dir) {
PR_CloseDir(dir);
return 1;
}
return 0;
}
|