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 )