2019-06-16 17:04:17 +00:00
|
|
|
#include <stdio.h>
|
2007-04-27 22:42:41 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <unistd.h>
|
2019-06-16 17:04:17 +00:00
|
|
|
#include <cpm.h>
|
|
|
|
#include "cpmsys.h"
|
2007-04-27 22:42:41 +00:00
|
|
|
|
|
|
|
int open(const char* path, int access, ...)
|
|
|
|
{
|
2019-06-16 17:04:17 +00:00
|
|
|
uint8_t fd = 0;
|
|
|
|
struct FCBE* fcbe = &__fd[0];
|
|
|
|
uint8_t olduser;
|
|
|
|
|
|
|
|
__init_file_descriptors();
|
|
|
|
while (fd != NUM_FILE_DESCRIPTORS)
|
|
|
|
{
|
|
|
|
if (fcbe->fcb.f[0] == 0)
|
|
|
|
break;
|
|
|
|
fd++;
|
|
|
|
fcbe++;
|
|
|
|
}
|
|
|
|
if (fd == NUM_FILE_DESCRIPTORS)
|
|
|
|
{
|
|
|
|
errno = EMFILE;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
fcbe->user = cpm_parse_filename(&fcbe->fcb, path);
|
|
|
|
|
|
|
|
olduser = cpm_get_user();
|
|
|
|
cpm_set_user(fcbe->user);
|
|
|
|
|
|
|
|
if (access & O_TRUNC)
|
|
|
|
{
|
|
|
|
cpm_delete_file(&fcbe->fcb);
|
|
|
|
access |= O_CREAT;
|
|
|
|
}
|
|
|
|
if (access & O_CREAT)
|
|
|
|
{
|
|
|
|
if (cpm_make_file(&fcbe->fcb) == 0xff)
|
|
|
|
goto eio;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (cpm_open_file(&fcbe->fcb) == 0xff)
|
|
|
|
goto eio;
|
|
|
|
}
|
|
|
|
|
|
|
|
cpm_seek_to_end(&fcbe->fcb);
|
|
|
|
fcbe->length = U16(fcbe->fcb.r);
|
|
|
|
if (!(access & O_APPEND))
|
|
|
|
U16(fcbe->fcb.r) = 0;
|
|
|
|
return fd;
|
|
|
|
|
|
|
|
eio:
|
|
|
|
fcbe->fcb.f[0] = 0;
|
|
|
|
errno = EIO;
|
2007-04-27 22:42:41 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2019-06-16 17:04:17 +00:00
|
|
|
|
|
|
|
|