/* vu-dash.c - the dash (stdin/stdout) file system
*
****************************************************************
* Copyright (C) 1999, 2000 Thomas Lord
*
* See the file "COPYING" for further information about
* the copyright and warranty status of this work.
*/
#include "hackerlab/os/errno.h"
#include "hackerlab/bugs/panic.h"
#include "hackerlab/rx-posix/regexps.h"
#include "hackerlab/vu/vu.h"
#include "hackerlab/vu/vu-sys.h"
#include "hackerlab/vu/vu-dash.h"
/* __STDC__ prototypes for static functions */
static int vu_dash_open (int * errn, char * path, int flags, int mode, void * closure);
static struct vu_fs_discipline vu_dash_vtable;
/************************************************************************
*(h0 "A VU Name Handler for Standard Input and Output")
*
* These functions provide a VU namespace handler for file names matching
* the regexp:
*
* ^-$
*
* When opened for `O_RDONLY' access, `"-"' refers to descriptor 0.
*
* When opened for `O_WRONLY' access, `"-"' refers to descriptor 1.
*
* The file `"-"' may not be opened for `O_RDWR' access.
*/
/*(c vu_push_dash_handler)
* void vu_push_dash_handler (int is_optional);
*
* Establish a VU namespace handler for file-names matching the
* regexp:
*
* ^-$
*
*
* When opened for `O_RDONLY' access, `"-"' refers to descriptor 0.
*
* When opened for `O_WRONLY' access, `"-"' refers to descriptor 1.
*
* The file `"-"' may not be opened for `O_RDWR' access.
*
* If the flag `is_optional' is 0, the namespace handler is simply
* installed. If it is not 0, the handler is registered under the
* name `"fd"', but not installed.
*
* (See xref:"vu_enable_optional_name_handler".)
*/
void
vu_push_dash_handler (int is_optional)
{
static int initialized = 0;
static regex_t rgx;
static t_uchar * doc[] =
{
"-",
"Standard input or output.",
0
};
if (!initialized)
{
if (0 > regcomp (&rgx, "^-$", 0))
panic ("unable to compile regexp");
initialized = 1;
}
vu_push_name_handler ("standard files", doc, &rgx, 0, &vu_dash_vtable, 0, is_optional);
}
static int
vu_dash_open (int * errn, char * path, int flags, int mode, void * closure)
{
switch (flags & O_ACCMODE)
{
case O_RDONLY:
return 0;
case O_WRONLY:
return 1;
default:
*errn = EINVAL;
return -1;
}
}
#define vu_dash_make_closure vu_sys_make_closure
#define vu_dash_free_closure vu_sys_free_closure
#define vu_dash_access vu_sys_access
#define vu_dash_chdir vu_sys_chdir
#define vu_dash_chmod vu_sys_chmod
#define vu_dash_chown vu_sys_chown
#define vu_dash_chroot vu_sys_chroot
#define vu_dash_close vu_sys_close
#define vu_dash_closedir vu_sys_closedir
#define vu_dash_fchdir vu_sys_fchdir
#define vu_dash_fchmod vu_sys_fchmod
#define vu_dash_fchown vu_sys_fchown
#define vu_dash_fstat vu_sys_fstat
#define vu_dash_fsync vu_sys_fsync
#define vu_dash_ftruncate vu_sys_ftruncate
#define vu_dash_link vu_sys_link
#define vu_dash_lseek vu_sys_lseek
#define vu_dash_lstat vu_sys_lstat
#define vu_dash_mkdir vu_sys_mkdir
#define vu_dash_opendir vu_sys_opendir
#define vu_dash_read vu_sys_read
#define vu_dash_readdir vu_sys_readdir
#define vu_dash_readlink vu_sys_readlink
#define vu_dash_rename vu_sys_rename
#define vu_dash_rmdir vu_sys_rmdir
#define vu_dash_stat vu_sys_stat
#define vu_dash_symlink vu_sys_symlink
#define vu_dash_telldir vu_sys_telldir
#define vu_dash_truncate vu_sys_truncate
#define vu_dash_unlink vu_sys_unlink
#define vu_dash_utime vu_sys_utime
#define vu_dash_write vu_sys_write
#define vu_dash_fcntl vu_sys_fcntl
#define vu_dash_dup vu_sys_dup
#define vu_dash_dup2 vu_sys_dup2
#define vu_dash_move_state vu_sys_move_state
static struct vu_fs_discipline vu_dash_vtable = { VU_FS_DISCIPLINE_INITIALIZERS (vu_dash_) };
syntax highlighted by Code2HTML, v. 0.9.1