rc

[fork] interactive rc shell
Log | Files | Refs | README | LICENSE

commit a988abd0be551c0c37fc20b49b233c8a22ebfe7a
parent 1a7f00653697b147d3be949c448b820f1e5fddbf
Author: tgoodwin <tgoodwin>
Date:   Wed, 21 Oct 1998 11:00:16 +0000

Initial revision

Diffstat:
Aopen.c | 45+++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+), 0 deletions(-)

diff --git a/open.c b/open.c @@ -0,0 +1,45 @@ +/* open.c: to insulate <fcntl.h> from the rest of rc. */ + +#include "rc.h" +#include <fcntl.h> + +/* + Opens a file with the necessary flags. Assumes the following + declaration for redirtype: + + enum redirtype { + rFrom, rCreate, rAppend, rHeredoc, rHerestring + }; +*/ + +static const int mode_masks[] = { + /* rFrom */ O_RDONLY, + /* rCreate */ O_TRUNC | O_CREAT | O_WRONLY, + /* rAppend */ O_APPEND | O_CREAT | O_WRONLY +}; + +extern int rc_open(const char *name, redirtype m) { + if ((unsigned) m >= arraysize(mode_masks)) + panic("bad mode passed to rc_open"); + return open(name, mode_masks[m], 0666); +} + +/* make a file descriptor non blocking. must only be called after read() +has returned EAGAIN. */ + +extern void makenonblock(int fd) { + int flags; + + if ((flags = fcntl(fd, F_GETFL)) == -1) { + uerror("fcntl"); + exit(1); + } + if (! (flags & O_NONBLOCK)) + panic("not O_NONBLOCK"); + flags &= ~O_NONBLOCK; + if (fcntl(fd, F_SETFL, (long) flags) == -1) { + uerror("fcntl"); + exit(1); + } +} +