1,53 → 1,62 |
#include "stddef.h" |
#include "sys/ksys.h" |
#include <stddef.h> |
#include <sys/ksys.h> |
#include <errno.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <sys/dirent.h> |
|
#define CREATE_FILE() if(_ksys_file_create(_name)){ \ |
errno= EIO; \ |
free(out); \ |
out = NULL; \ |
|
static FILE* _set_errno(FILE *out, int err){ |
errno = err; |
if(out){ |
free(out->name); |
free(out); |
} |
out = NULL; |
return out; |
} |
|
static void _create_file(char *name, FILE *out){ |
if(_ksys_file_create(name)){ |
_set_errno(out, EIO); |
} |
} |
|
FILE *freopen(const char *restrict _name, const char *restrict _mode, FILE *restrict out) { |
if(!_name || !_mode || !out){ |
errno = EINVAL; |
return NULL; |
return _set_errno(out, EINVAL); |
} |
|
if (strchr(_mode, 'r')) { out->mode = _FILEMODE_R; } |
if (strchr(_mode, 'a')) { out->mode = _FILEMODE_A; } |
if (strchr(_mode, 'w')) { out->mode = _FILEMODE_W; } |
|
ksys_bdfe_t info; |
int no_file = _ksys_file_get_info(_name, &info); |
if(!no_file && info.attributes & IS_FOLDER){ |
return _set_errno(out, EISDIR); |
} |
|
out->eof=0; |
out->error=0; |
out->position=0; |
out->name = strdup(_name); |
|
switch (out->mode) { |
case _FILEMODE_A : |
if (strchr(_mode, 'r')) { out->mode = _FILEMODE_R; } |
if (strchr(_mode, 'w')) { out->mode = _FILEMODE_W; } |
if (strchr(_mode, 'a')) { out->mode = _FILEMODE_A; } |
if (strchr(_mode, '+')) { out->mode |= _FILEMODE_PLUS; } |
|
if(out->mode & _FILEMODE_A){ |
if(no_file){ |
CREATE_FILE(); |
_create_file(out->name, out); |
} |
out->position = info.size; |
break; |
case _FILEMODE_W : |
CREATE_FILE(); |
break; |
case _FILEMODE_R : |
}else if(out->mode & _FILEMODE_W){ |
_create_file(out->name, out); |
}else if((out->mode & _FILEMODE_R)){ |
if(no_file){ |
free(out); |
out = NULL; |
_set_errno(out, ENOENT); |
} |
break; |
default: |
free(out); |
out = NULL; |
break; |
}else{ |
_set_errno(out, EINVAL); |
} |
return out; |
} |