Neo4j-Client
view release on metacpan or search on metacpan
build/lib/src/dotdir.c view on Meta::CPAN
char *rbuf = realloc(*buf, len + 1);
if (rbuf == NULL)
{
goto failure;
}
*buf = rbuf;
*n = len + 1;
}
assert(len < *n);
char *p = *buf + hlen;
*(p++) = '/';
memcpy(p, NEO4J_DOT_DIR, dlen);
p += dlen;
if (alen > 0)
{
*(p++) = '/';
memcpy(p, append, alen);
p += alen;
}
*p = '\0';
}
return len;
int errsv;
failure:
errsv = errno;
if (allocate)
{
free(*buf);
*buf = NULL;
}
errno = errsv;
return -1;
}
ssize_t homedir(char **buf, size_t *n)
{
ssize_t result = -1;
char *pwbuf = NULL;
const char *hdir = getenv("HOME");
if (hdir == NULL)
{
ssize_t pwbufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
if (pwbufsize < 0)
{
return -1;
}
pwbuf = malloc(pwbufsize);
if (pwbuf == NULL)
{
return -1;
}
struct passwd pwd;
struct passwd *result = NULL;
int err = getpwuid_r(geteuid(), &pwd, pwbuf, pwbufsize, &result);
if (err != 0)
{
errno = err;
goto cleanup;
}
if (result == NULL)
{
errno = EIDRM;
goto cleanup;
}
hdir = pwd.pw_dir;
}
size_t hlen = strlen(hdir);
for (; hlen > 0 && hdir[hlen-1] == '/'; --hlen)
;
if (buf != NULL)
{
if (*buf == NULL)
{
*buf = malloc(hlen + 1);
if (*buf == NULL)
{
goto cleanup;
}
*n = hlen + 1;
}
else if ((hlen + 1) > *n)
{
errno = ERANGE;
goto cleanup;
}
memcpy(*buf, hdir, hlen + 1);
}
result = hlen;
int errsv;
cleanup:
errsv = errno;
free(pwbuf);
errno = errsv;
return result;
}
( run in 1.679 second using v1.01-cache-2.11-cpan-39bf76dae61 )