Example #1
0
    ssize_t
alcove_sys_setenv(alcove_state_t *ap, const char *arg, size_t len,
        char *reply, size_t rlen)
{
    int index = 0;
    char name[MAXMSGLEN] = {0};
    size_t namelen = sizeof(name)-1;
    char value[MAXMSGLEN] = {0};
    size_t valuelen = sizeof(value)-1;
    int overwrite = 0;
    int rv = 0;

    UNUSED(ap);

    /* name */
    if (alcove_decode_iolist(arg, len, &index, name, &namelen) < 0 ||
            namelen == 0)
        return -1;

    /* value */
    if (alcove_decode_iolist(arg, len, &index, value, &valuelen) < 0)
        return -1;

    /* overwrite */
    if (alcove_decode_int(arg, len, &index, &overwrite) < 0)
        return -1;

    rv = setenv(name, value, overwrite);

    return (rv < 0)
        ? alcove_mk_errno(reply, rlen, errno)
        : alcove_mk_atom(reply, rlen, "ok");
}
Example #2
0
/*
 * umount(2)
 *
 */
    ssize_t
alcove_sys_umount(alcove_state_t *ap, const char *arg, size_t len,
        char *reply, size_t rlen)
{
    int index = 0;

    char source[PATH_MAX] = {0};
    size_t slen = sizeof(source)-1;

    int rv = 0;

    UNUSED(ap);

    /* source */
    if (alcove_decode_iolist(arg, len, &index, source, &slen) < 0 ||
            slen == 0)
        return -1;

#if defined(__linux__) || defined(__sunos__)
    rv = umount(source);
#else
    rv = unmount(source, 0);
#endif

    return (rv < 0)
        ? alcove_mk_errno(reply, rlen, errno)
        : alcove_mk_atom(reply, rlen, "ok");
}
Example #3
0
/*
 * write(2)
 *
 */
    ssize_t
alcove_sys_write(alcove_state_t *ap, const char *arg, size_t len,
        char *reply, size_t rlen)
{
    int index = 0;
    int rindex = 0;

    int fd = -1;
    char buf[MAXMSGLEN] = {0};
    size_t buflen = sizeof(buf);
    int rv = 0;

    /* fd */
    if (alcove_decode_int(arg, len, &index, &fd) < 0)
        return -1;

    /* buf */
    if (alcove_decode_iolist(arg, len, &index, buf, &buflen) < 0)
        return -1;

    rv = write(fd, buf, buflen);

    if (rv < 0) {
        rindex = alcove_mk_errno(reply, rlen, errno);
    }
    else {
        ALCOVE_OK(reply, &rindex,
            alcove_encode_longlong(reply, rlen, &rindex, rv));
    }

    return rindex;
}
Example #4
0
/*
 * chown(2)
 *
 */
    ssize_t
alcove_sys_chown(alcove_state_t *ap, const char *arg, size_t len,
        char *reply, size_t rlen)
{
    int index = 0;

    char path[PATH_MAX] = {0};
    size_t plen = sizeof(path)-1;
    uid_t owner = {0};
    gid_t group = {0};
    int rv = 0;

    /* path */
    if (alcove_decode_iolist(arg, len, &index, path, &plen) < 0 ||
            plen == 0)
        return -1;

    /* owner */
    if (alcove_decode_uint(arg, len, &index, &owner) < 0)
        return -1;

    /* group */
    if (alcove_decode_uint(arg, len, &index, &group) < 0)
        return -1;

    rv = chown(path, owner, group);

    return (rv < 0)
        ? alcove_mk_errno(reply, rlen, errno)
        : alcove_mk_atom(reply, rlen, "ok");
}
Example #5
0
/*
 * readdir(3)
 *
 */
    ssize_t
alcove_sys_readdir(alcove_state_t *ap, const char *arg, size_t len,
        char *reply, size_t rlen)
{
    int index = 0;
    int rindex = 0;

    char name[PATH_MAX] = {0};
    size_t namelen = sizeof(name)-1;
    DIR *dirp = NULL;
    struct dirent *dent = NULL;

    UNUSED(ap);

    /* name */
    if (alcove_decode_iolist(arg, len, &index, name, &namelen) < 0 ||
            namelen == 0)
        return -1;

    dirp = opendir(name);

    if (dirp == NULL)
        return alcove_mk_errno(reply, rlen, errno);

    ALCOVE_ERR(alcove_encode_version(reply, rlen, &rindex));
    ALCOVE_ERR(alcove_encode_tuple_header(reply, rlen, &rindex, 2));
    ALCOVE_ERR(alcove_encode_atom(reply, rlen, &rindex, "ok"));

    errno = 0;
    while ( (dent = readdir(dirp))) {
        ALCOVE_ERR(alcove_encode_list_header(reply, rlen, &rindex, 1));
        ALCOVE_ERR(alcove_encode_binary(reply, rlen, &rindex,
                    dent->d_name, strlen(dent->d_name)));
    }

    if (errno != 0)
        return alcove_mk_errno(reply, rlen, errno);

    if (closedir(dirp) < 0)
        return alcove_mk_errno(reply, rlen, errno);

    ALCOVE_ERR(alcove_encode_empty_list(reply, rlen, &rindex));

    return rindex;
}
Example #6
0
/*
 * rmdir(2)
 *
 */
    ssize_t
alcove_sys_rmdir(alcove_state_t *ap, const char *arg, size_t len,
        char *reply, size_t rlen)
{
    int index = 0;
    char pathname[PATH_MAX] = {0};
    size_t pathlen = sizeof(pathname)-1;
    int rv = 0;

    /* pathname */
    if (alcove_decode_iolist(arg, len, &index, pathname, &pathlen) < 0 ||
            pathlen == 0)
        return -1;

    rv = rmdir(pathname);

    return (rv < 0)
        ? alcove_mk_errno(reply, rlen, errno)
        : alcove_mk_atom(reply, rlen, "ok");
}