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"); }
/* * 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"); }
/* * 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; }
/* * 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"); }
/* * 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; }
/* * 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"); }