mirror of
https://git.openafs.org/openafs.git
synced 2025-01-31 05:27:44 +00:00
IRIX: Implement makesname()
makesname() make a semaphore name for use in <sys/sema.h>-type routines on IRIX. It takes as input a pointer to an allocated string buffer (sname) of size METER_NAMSZ, a string prefix (prefix), and a vnode number (v_number). When complete, sname is returned, pointing to the beginning of a NULL-terminated string containing the new name, with a maximum of (METER_NAMSZ-1) characters plus the NULL. The name is a concatenation of the string at 'prefix' and the ASCII representation of the number in 'v_number'. Note: Due to IRIX's use of uint64 to represent vnumber_t and a maximum semaphore name length of 15 (METER_NAMSZ-1), this function cannot be guaranteed to produce a name which uniquely describes a vnode. makesname() is already called from afs_vcache.c but not (or no longer) available / implemented elsewhere. Change-Id: I4331c161b68b39a4c067691c97363b637d13ff15 Change-Id: Ia0a615426dc05e01a98e53e89ec3bae3726cac34 Reviewed-on: http://gerrit.openafs.org/2155 Reviewed-by: Chaz Chandler <clc31@inbox.com> Tested-by: Chaz Chandler <clc31@inbox.com> Reviewed-by: Andrew Deason <adeason@sinenomine.net> Reviewed-by: Derrick Brashear <shadow@dementia.org>
This commit is contained in:
parent
7759e83795
commit
b1a50290e6
@ -30,6 +30,63 @@ afs_mpservice(void *a)
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
* make a semaphore name for use in <sys/sema.h>-type routines on
|
||||
* IRIX
|
||||
*
|
||||
* \param[out] sname will contain the semaphore name and
|
||||
* should point to an allocated string
|
||||
* buffer of size METER_NAMSZ
|
||||
* \param[in] prefix string with which to start the name
|
||||
* \param[in] v_number vnode number to complete the name
|
||||
*
|
||||
* \post sname will point to the beginning of a NULL-terminated
|
||||
* string to be used as a semaphore name with a maximum of
|
||||
* (METER_NAMSZ-1) characters plus the NULL. The name is a
|
||||
* concatenation of the string at 'prefix' and the ASCII
|
||||
* representation of the number in 'v_number'. sname is
|
||||
* returned.
|
||||
*
|
||||
* \note Due to IRIX's use of uint64_t to represent vnumber_t and a
|
||||
* maximum semaphore name length of 15 (METER_NAMSZ-1), this
|
||||
* function cannot be guaranteed to produce a name which
|
||||
* uniquely describes a vnode.
|
||||
*
|
||||
*/
|
||||
char *
|
||||
makesname(char *sname, const char *prefix, vnumber_t v_number)
|
||||
{
|
||||
char vnbuf[21]; /* max number of uint64 decimal digits + 1 */
|
||||
size_t prlen, vnlen;
|
||||
|
||||
if (sname) {
|
||||
/*
|
||||
* Note: IRIX doesn't have realloc() available in the
|
||||
* kernel, so the openafs util implementation of snprintf is
|
||||
* not usable. What follows is intended to reproduce the
|
||||
* behavior of:
|
||||
* snprintf(sname, METER_NAMSZ, "%s%llu", prefix,
|
||||
* (unsigned long long)v_number);
|
||||
* Additionally, the kernel only provides a void sprintf(),
|
||||
* making length checking slightly more difficult.
|
||||
*/
|
||||
prlen = strlen(prefix);
|
||||
if (prlen > METER_NAMSZ-1)
|
||||
prlen = METER_NAMSZ-1;
|
||||
strncpy(sname, prefix, prlen);
|
||||
|
||||
memset(vnbuf, 0, sizeof(vnbuf));
|
||||
sprintf(vnbuf, "%llu", (unsigned long long)v_number);
|
||||
vnlen = strlen(vnbuf);
|
||||
if (vnlen+prlen > METER_NAMSZ-1)
|
||||
vnlen = METER_NAMSZ-1-prlen;
|
||||
if (vnlen > 0)
|
||||
strncpy(&(sname[prlen]), vnbuf, vnlen);
|
||||
sname[vnlen+prlen] = '\0';
|
||||
}
|
||||
return sname;
|
||||
}
|
||||
|
||||
#ifdef AFS_SGI_VNODE_GLUE
|
||||
#include <sys/invent.h>
|
||||
extern mutex_t afs_init_kern_lock;
|
||||
|
Loading…
x
Reference in New Issue
Block a user