/** * Calculate the basename of a key name and put it in @p returned finalizing * the string with NULL. * * Some examples: * - basename of @c system/some/keyname is @c keyname * - basename of @c "user/tmp/some key" is @c "some key" * * @param key the key to extract basename from * @param returned a pre-allocated buffer to store the basename * @param maxSize size of the @p returned buffer * @return number of bytes copied to @p returned * @retval 1 on empty name * @retval -1 on NULL pointers * @retval -1 when maxSize is 0 or larger than SSIZE_MAX * @see keyBaseName(), keyGetBaseNameSize() * @see keyName(), keyGetName(), keySetName() * @ingroup keyname */ ssize_t keyGetBaseName (const Key * key, char * returned, size_t maxSize) { if (!key) return -1; if (!returned) return -1; if (!maxSize) return -1; if (maxSize > SSIZE_MAX) return -1; ssize_t maxSSize = maxSize; if (!key->key) { returned[0] = 0; return 1; } ssize_t baseSize = keyGetBaseNameSize (key); if (maxSSize < baseSize) { return -1; } const char * baseName = keyBaseName (key); if (!baseName) { return -1; } strncpy (returned, baseName, baseSize); return baseSize; }
NSS_STATUS _nss_registry_getspent_r (struct spwd *pw, char * buffer, size_t buflen,int * errnop) { Key *tempkey; int usernamesize; char *username; NSS_STATUS tmpstatus; /* Hmm..I wonder if I should start it implicitly when this function is * called without setent */ if(shadowks==NULL) return NSS_STATUS_UNAVAIL; if(shadowkey==NULL) { /* End of list */ return NSS_STATUS_NOTFOUND; } usernamesize = keyGetBaseNameSize(shadowkey); username = (char *)malloc(usernamesize); keyGetBaseName(shadowkey, username, usernamesize); tmpstatus = _nss_registry_getspnam_r(username, pw, buffer, buflen, errnop); free(username); tempkey = shadowkey; shadowkey = tempkey->next; return tmpstatus; }
/** * @retval 1 and an allocated string of the pluginName if a new plugins should be created. * @retval 2 and an allocated string of the referenceName if an old plugin should be used * @retval 3 and both if a new plugin should be created and made available for later * back referencing. * @retval -1 on error */ int elektraProcessPlugin (Key * cur, int * pluginNumber, char ** pluginName, char ** referenceName, Key * errorKey) { const char * fullname = keyBaseName (cur); size_t fullsize = keyGetBaseNameSize (cur); if (fullname[0] != '#') { ELEKTRA_ADD_WARNING (18, errorKey, fullname); return -1; } if (fullname[1] < '0' || fullname[1] > '9') { ELEKTRA_ADD_WARNING (19, errorKey, fullname); return -1; } *pluginNumber = fullname[1] - '0'; if (*pluginNumber > NR_OF_PLUGINS) { ELEKTRA_ADD_WARNING (20, errorKey, fullname); return -1; } if (fullname[2] == '#') { char prefixReferenceName[] = "system/elektra/plugins/"; /* We have a back reference here */ if (fullname[fullsize - 2] == '#') { const char * iter = &fullname[3]; size_t pluginNameSize = 1; /* For null character */ size_t referenceNameSize = 0; /* We will introduce a new plugin */ while (*iter != '#') { ++iter; ++pluginNameSize; } *pluginName = elektraMalloc (pluginNameSize); strncpy (*pluginName, &fullname[3], pluginNameSize); (*pluginName)[pluginNameSize - 1] = 0; referenceNameSize = fullsize - pluginNameSize - 4; ++iter; /* advance to one after hash */ *referenceName = elektraMalloc (referenceNameSize + sizeof (prefixReferenceName)); strncpy (*referenceName, prefixReferenceName, sizeof (prefixReferenceName)); strncat (*referenceName, iter, referenceNameSize); (*referenceName)[referenceNameSize + sizeof (prefixReferenceName) - 2] = 0; return 3; } else { /* We reference back to a plugin */ *referenceName = elektraMalloc (fullsize - 3 + sizeof (prefixReferenceName) - 1); strncpy (*referenceName, prefixReferenceName, sizeof (prefixReferenceName)); strncat (*referenceName, &fullname[3], fullsize - 3); return 2; } } else { *pluginName = elektraMalloc (fullsize - 2); /* don't alloc for #n */ strncpy (*pluginName, &fullname[2], fullsize - 2); return 1; } /* Should not be reached */ return 0; }