Initial revision
This commit is contained in:
53
modules/src/system/open.c
Normal file
53
modules/src/system/open.c
Normal file
@@ -0,0 +1,53 @@
|
||||
/* $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;
|
||||
}
|
||||
Reference in New Issue
Block a user