ack/modules/src/system/open.c

58 lines
1,015 B
C
Raw Normal View History

1987-03-09 15:15:03 +00:00
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
1987-01-06 11:41:50 +00:00
/* $Header$ */
#include <system.h>
extern File *_get_entry();
int
sys_open(path, flag, filep)
char *path;
int flag;
File **filep;
{
register fd;
register File *fp;
int open_mode;
long lseek();
switch (flag) {
case OP_READ:
open_mode = 0;
break;
case OP_WRITE:
case OP_APPEND:
open_mode = 1;
break;
default:
return 0;
}
if ((fp = _get_entry()) == (File *)0)
return 0;
if (flag == OP_WRITE) {
if ((fd = creat(path, 0644)) < 0)
return 0;
}
else /* OP_READ or OP_APPEND */
if ((fd = open(path, open_mode)) < 0) {
if (flag == OP_READ || access(path, 0) == 0)
return 0;
/* now: flag == OP_APPEND */
if ((fd = creat(path, 0644)) < 0)
return 0;
}
else {
if (flag == OP_APPEND && (lseek(fd, 0L, 2) < 0L)) {
close(fd);
return 0;
}
}
fp->o_flags = flag;
fp->o_fd = fd;
*filep = fp;
return 1;
}