/* vu-sys.c - direct VU functions
*
****************************************************************
* Copyright (C) 1999, 2000 Thomas Lord
*
* See the file "COPYING" for further information about
* the copyright and warranty status of this work.
*/
#include <stdio.h>
#include "hackerlab/os/errno.h"
#include "hackerlab/os/unistd.h"
#include "hackerlab/mem/mem.h"
#include "hackerlab/vu/vu-sys.h"
#include "hackerlab/char/str.h"
/************************************************************************
*(h0 "VU Native File System Access")
*
*
* These functions define a trivial file-system implementation in
* which all functions call their system-call equivalents.
*/
struct vu_fs_discipline _vu_system_fs_vtable
= { VU_FS_DISCIPLINE_INITIALIZERS (vu_sys_) };
/*(c vu_sys_make_closure)
* void * vu_sys_make_closure (void * closure);
*
* Return `closure'.
*/
void *
vu_sys_make_closure (void * closure)
{
return closure;
}
/*(c vu_sys_free_closure)
* void vu_sys_free_closure (void * closure);
*
* A noop.
*/
void
vu_sys_free_closure (void * closure)
{}
/*(c vu_sys_access)
* int vu_sys_access (int * errn, char * path, int mode, void * closure);
*
* Call `access'.
*/
int
vu_sys_access (int * errn, char * path, int mode, void * closure)
{
int rv;
rv = access (path, mode);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_chdir)
* int vu_sys_chdir (int * errn, char * path, void * closure);
*
* Call `chdir'.
*/
int
vu_sys_chdir (int * errn, char * path, void * closure)
{
int rv;
rv = chdir (path);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_chmod)
* int vu_sys_chmod (int * errn, char * path, int mode, void * closure);
*
* Call `chmod'.
*/
int
vu_sys_chmod (int * errn, char * path, int mode, void * closure)
{
int rv;
rv = chmod (path, mode);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_chown)
* int vu_sys_chown (int * errn,
* char * path,
* int owner,
* int group,
* void * closure);
*
* Call `chown'.
*/
int
vu_sys_chown (int * errn,
char * path,
int owner,
int group,
void * closure)
{
int rv;
rv = chown (path, owner, group);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_chroot)
* int vu_sys_chroot (int * errn, char * path, void * closure);
*
* Call `chroot'.
*/
int
vu_sys_chroot (int * errn, char * path, void * closure)
{
int rv;
rv = chroot (path);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_closedir)
* int vu_sys_closedir (int * errn, DIR * dir, void * closure);
*
* Call `closedir'.
*/
int
vu_sys_closedir (int * errn, DIR * dir, void * closure)
{
int rv;
rv = closedir (dir);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_close)
* int vu_sys_close (int * errn, int fd, void * closure);
*
* Call `close'.
*/
int
vu_sys_close (int * errn, int fd, void * closure)
{
int rv;
rv = close (fd);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_fchdir)
* int vu_sys_fchdir (int * errn, int fd, void * closure);
*
* Call `fchdir'.
*/
int
vu_sys_fchdir (int * errn, int fd, void * closure)
{
int rv;
rv = fchdir (fd);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_fchmod)
* int vu_sys_fchmod (int * errn, int fd, int mode, void * closure);
*
* Call `fchmod'.
*/
int
vu_sys_fchmod (int * errn, int fd, int mode, void * closure)
{
int rv;
rv = fchmod (fd, mode);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_fchown)
* int vu_sys_fchown (int * errn,
* int fd,
* int owner,
* int group,
* void * closure);
*
* Call `fchown'.
*/
int
vu_sys_fchown (int * errn,
int fd,
int owner,
int group,
void * closure)
{
int rv;
rv = fchown (fd, owner, group);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_fstat)
* int vu_sys_fstat (int * errn,
* int fd,
* struct stat * buf,
* void * closure);
*
* Call `fstat'.
*/
int
vu_sys_fstat (int * errn,
int fd,
struct stat * buf,
void * closure)
{
int rv;
rv = fstat (fd, buf);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_fsync)
* int vu_sys_fsync (int * errn, int fd, void * closure);
*
* Call `fsync'.
*/
int
vu_sys_fsync (int * errn, int fd, void * closure)
{
int rv;
rv = fsync (fd);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_ftruncate)
* int vu_sys_ftruncate (int * errn, int fd, off_t where, void * closure);
*
* Call `ftruncate'.
*/
int
vu_sys_ftruncate (int * errn, int fd, off_t where, void * closure)
{
int rv;
rv = ftruncate (fd, where);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_link)
* int vu_sys_link (int * errn, char * from, char * to, void * closure);
*
* Call `link'.
*/
int
vu_sys_link (int * errn, char * from, char * to, void * closure)
{
int rv;
rv = link (from, to);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_lseek)
* off_t vu_sys_lseek (int * errn,
* int fd,
* off_t offset,
* int whence,
* void * closure);
*
* Call `lseek'.
*/
off_t
vu_sys_lseek (int * errn,
int fd,
off_t offset,
int whence,
void * closure)
{
off_t rv;
rv = lseek (fd, offset, whence);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_lstat)
* int vu_sys_lstat (int * errn,
* char * path,
* struct stat * buf,
* void * closure);
*
* Call `lstat'.
*/
int
vu_sys_lstat (int * errn,
char * path,
struct stat * buf,
void * closure)
{
int rv;
rv = lstat (path, buf);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_mkdir)
* int vu_sys_mkdir (int * errn, char * path, int mode, void * closure);
*
* Call `mkdir'.
*/
int
vu_sys_mkdir (int * errn, char * path, int mode, void * closure)
{
int rv;
rv = mkdir (path, mode);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_open)
* int vu_sys_open (int * errn,
* char * path,
* int flags,
* int mode,
* void * closure);
*
* Call `open'.
*/
int
vu_sys_open (int * errn,
char * path,
int flags,
int mode,
void * closure)
{
int rv;
rv = open (path, flags, mode);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_opendir)
* int vu_sys_opendir (int * errn,
* DIR ** retv,
* char * path,
* void * closure);
*
* Call `opendir'.
*/
int
vu_sys_opendir (int * errn,
DIR ** retv,
char * path,
void * closure)
{
*retv = opendir (path);
if (!*retv)
*errn = errno;
return (*retv == 0 ? -1 : 0);
}
/*(c vu_sys_read)
* ssize_t vu_sys_read (int * errn,
* int fd,
* char * buf,
* size_t count,
* void * closure);
*
*
* Call `read'.
*/
ssize_t
vu_sys_read (int * errn,
int fd,
char * buf,
size_t count,
void * closure)
{
ssize_t rv;
rv = read (fd, buf, count);
if (rv == -1)
*errn = errno;
return rv;
}
/*(c vu_sys_readdir)
* int vu_sys_readdir (int * errn,
* struct alloc_limits * limits,
* char ** file_ret,
* DIR * dir,
* void * closure);
*
* Call `readdir'.
*/
int
vu_sys_readdir (int * errn,
struct alloc_limits * limits,
char ** file_ret,
DIR * dir,
void * closure)
{
struct dirent * de;
errno = 0;
de = readdir (dir);
if (!de)
{
*errn = errno;
return -1;
}
if (file_ret)
{
*file_ret = str_save (limits, de->d_name);
if (!*file_ret)
{
*errn = ENOMEM;
return -1;
}
}
return 0;
}
/*(c vu_sys_readlink)
* int vu_sys_readlink (int * errn,
* char * path,
* char * buf,
* int bufsize,
* void * closure);
*
* Call `readlink'.
*/
int
vu_sys_readlink (int * errn,
char * path,
char * buf,
int bufsize,
void * closure)
{
int rv;
rv = readlink (path, buf, bufsize);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_rename)
* int vu_sys_rename (int * errn, char * from, char * to, void * closure);
*
* Call `rename'.
*/
int
vu_sys_rename (int * errn, char * from, char * to, void * closure)
{
int rv;
rv = rename (from, to);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_rmdir)
* int vu_sys_rmdir (int * errn, char * path, void * closure);
*
* Call `rmdir'.
*/
int
vu_sys_rmdir (int * errn, char * path, void * closure)
{
int rv;
rv = rmdir (path);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_stat)
* int vu_sys_stat (int * errn,
* char * path,
* struct stat * buf,
* void * closure);
*
* Call `stat'.
*/
int
vu_sys_stat (int * errn,
char * path,
struct stat * buf,
void * closure)
{
int rv;
rv = stat (path, buf);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_symlink)
* int vu_sys_symlink (int * errn, char * from, char * to, void * closure);
*
* Call `symlink'.
*/
int
vu_sys_symlink (int * errn, char * from, char * to, void * closure)
{
int rv;
rv = symlink (from, to);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_truncate)
* int vu_sys_truncate (int * errn,
* char * path,
* off_t where,
* void * closure);
*
* Call `truncate'.
*/
int
vu_sys_truncate (int * errn,
char * path,
off_t where,
void * closure)
{
int rv;
rv = truncate (path, where);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_unlink)
* int vu_sys_unlink (int * errn, char * path, void * closure);
*
* Call `unlink'.
*/
int
vu_sys_unlink (int * errn, char * path, void * closure)
{
int rv;
rv = unlink (path);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_utime)
* int vu_sys_utime (int * errn,
* char * path,
* struct utimbuf * times,
* void * closure);
*
* Call `utime'.
*/
int
vu_sys_utime (int * errn,
char * path,
struct utimbuf * times,
void * closure)
{
int rv;
rv = utime (path, times);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_write)
* ssize_t vu_sys_write (int * errn,
* int fd,
* char const * buf,
* size_t count,
* void * closure);
*
* Call `write'.
*/
ssize_t
vu_sys_write (int * errn,
int fd,
char const * buf,
size_t count,
void * closure)
{
ssize_t rv;
if (count == 0)
{
/* Posix leaves unspecified the behavior of `write' if
* `count' is 0 and `fd' is not a regular file.
*
* I beg to differ.
*/
return 0;
}
rv = write (fd, buf, count);
if (rv == -1)
*errn = errno;
return rv;
}
/*(c vu_sys_fcntl)
* int vu_sys_fcntl (int * errn,
* int fd,
* int cmd,
* long arg,
* void * closure);
*
* Call `fcntl'.
*/
int
vu_sys_fcntl (int * errn,
int fd,
int cmd,
long arg,
void * closure)
{
int rv;
rv = fcntl (fd, cmd, arg);
if (rv)
*errn = errno;
return rv;
}
/*(c vu_sys_dup)
* int vu_sys_dup (int * errn, int fd, void * closure);
*
* Call `dup'.
*/
int
vu_sys_dup (int * errn, int fd, void * closure)
{
int rv;
rv = dup (fd);
if (rv == -1)
*errn = errno;
return rv;
}
/*(c vu_sys_dup2)
* int vu_sys_dup2 (int * errn, int fd, int newfd, void * closure);
*
* Call `dup2'.
*/
int
vu_sys_dup2 (int * errn, int fd, int newfd, void * closure)
{
int rv;
rv = dup2 (fd, newfd);
if (rv == -1)
*errn = errno;
return rv;
}
/*(c vu_sys_move_state)
* int vu_sys_move_state (int * errn, int fd, int newfd, void * closure);
*
* A noop (return 0).
*/
int
vu_sys_move_state (int * errn, int fd, int newfd, void * closure)
{
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1