예제 #1
0
void sys_close(int fd)
{
    struct file* close_file = map_find(get_filemap(), fd);

    if(close_file != NULL)
    {
        filesys_close(close_file);
        map_remove(get_filemap(), fd); // important to remove from file hEHE
    }
}
예제 #2
0
파일: file.c 프로젝트: cty12/ucore_plus
static int filemap_alloc(int fd, struct file **file_store)
{
	struct file *file = get_filemap();
	if (fd == NO_FD) {
		for (fd = 0; fd < FS_STRUCT_NENTRY; fd++, file++) {
			if (file->status == FD_NONE) {
				goto found;
			}
		}
		return -E_MAX_OPEN;
	} else {
		if (testfd(fd)) {
			file += fd;
			if (file->status == FD_NONE) {
				goto found;
			}
			return -E_BUSY;
		}
		return -E_INVAL;
	}
found:
	assert(fopen_count(file) == 0);
	file->status = FD_INIT, file->node = NULL;
	*file_store = file;
	return 0;
}
예제 #3
0
/**
 * Skriver till fd (skärm eller fil)
 * Returnerar antalet skrivna tecken eller -1 om antalet tecken som ska skrivas
 * är 0 eller om filen inte finns.
 */
int sys_write(int fd, const void* buffer, unsigned length)
{
    if (fd == STDIN_FILENO) // Vi kan inte skriva till tangentbordet
    {
        return -1;
    }

    if (fd == STDOUT_FILENO) // skärmen
    {
        putbuf(buffer, length);
        return length;
    }
    else
    {
        // Skriva till fil
        struct file* write_to = map_find(get_filemap(), fd);
        if(write_to != NULL)
        {
            // Skriver buffer till write_to. Returnerar antalet skrivna tecken
            // Kan returnera ett antal tecken < length om filen är för liten
            return file_write(write_to, buffer, length);
        }
        else
        {
            return -1; // Filen finns inte, eller så ville vi skriva 0 tecken.
        }
    }
    // Hit ska vi inte komma!
}
예제 #4
0
void sys_seek(int fd, unsigned position)
{
    struct file* file = map_find(get_filemap(), fd);

    if (file != NULL && position <= (unsigned)sys_filesize(fd))
        file_seek(file, position);
}
예제 #5
0
int sys_filesize(int fd)
{
    struct file* file = map_find(get_filemap(), fd);

    if (file != NULL)
        return file_length(file);

    return -1;
}
예제 #6
0
unsigned sys_tell (int fd)
{
    struct file* file = map_find(get_filemap(), fd);

    if (file != NULL)
        return file_tell(file);

    return -1;
}
예제 #7
0
bool sys_create(const char* file, unsigned initial_size)
{
    if (filesys_create(file, initial_size) && initial_size >= 0)
    {
        map_insert(get_filemap(), filesys_open(file));
        return true;
    }
    return false;
}
예제 #8
0
파일: file.c 프로젝트: cty12/ucore_plus
static inline int fd2file(int fd, struct file **file_store)
{
	if (testfd(fd)) {
		struct file *file = get_filemap() + fd;
		if (file->status == FD_OPENED && file->fd == fd) {
			*file_store = file;
			return 0;
		}
	}
	return -E_INVAL;
}
예제 #9
0
int sys_open(const char* file)
{
    struct file* temp = filesys_open(file);

    if(temp != NULL)
    {
        // Mata in pekaren till filen i mapen
        // filemap finns initierad i thread.h/c

        return map_insert(get_filemap(), temp); // returnerar värdet i mapen
    }
    return -1; // filen fanns inte
}
예제 #10
0
파일: dri.c 프로젝트: avan06/ONScripter-CN
/*
 * Initilize drifile object and check file
 *   file    : file name array
 *   cnt     : number in file name array
 *   mmapping: mmap file or not
 *   return: drifile object
*/
drifiles *dri_init(char **file, int cnt, boolean mmapping) {
	drifiles *d = g_new0(drifiles, 1);
	FILE *fp;
	int i;
	boolean gotmap = FALSE;
	long filesize;
	char **filetop = file;
	
	for (i = 0; i < cnt; i++) {
		if (*(file + i) == NULL) continue;
		/* open check */
		if (NULL == (fp = fopen(*(file + i), "r"))) {
			SYSERROR("File %s is not found\n", *(file + i));
		}
		/* check is drifile or noe */
		if (!filecheck(fp)) {
			SYSERROR("File %s is not dri file\n", *(file + i));
		}
		/* get file map */
		if (!gotmap) {
			get_filemap(d, fp);
			gotmap = TRUE;
		}
		/* get pointer */
		get_fileptr(d, fp, i);
		/* get file size for mmap */
		filesize = getfilesize(fp);
		/* copy filenme */
		d->fnames[i] = strdup(*(file + i));
		/* close */
		fclose(fp);
		/* mmap */
		if (mmapping) {
			int fd;
			if (0 > (fd = open(*(file + i),  O_RDONLY))) {
				SYSERROR("open: %s\n", strerror(errno));
			}
			if (MAP_FAILED == (d->mmapadr[i] = mmap(0, filesize, PROT_READ, MAP_SHARED, fd, 0))) {
				WARNING("mmap: %s\n", strerror(errno));
				close(fd);
				mmapping = d->mmapped = FALSE;
				i = 0; file = filetop; /* retry */
				continue;
			}
			d->mmapped = TRUE;
		}
	}
	return d;
}
예제 #11
0
int main( int argc, char **argv )
{
	int fd;
	uint64_t length = 4294967296ULL;
	filemap_S fmap;
	int rc;

	if ( argc != 2 ) {
		printf( "Usage: %s <filename>\n", argv[ 0 ] );
		return 1;
	}

	/*
	if ( 0 != my_fallocate( argv[1], length ) ) 
		printf( "my_fallocate failed\n" );
	else
		printf( "my_fallocate success\n" );
	*/

	fd = open( argv[ 1 ], O_RDWR | O_CREAT );
	if ( 0 >= fd ) {
		perror( "open" );
		return 1;
	}
	
	/*
	rc = posix_fallocate( fd, 0, length );
	if ( rc ) {
		printf( "posix_fallocate failed: %s\n", strerror( rc ) );
		goto out;
	}
	*/

	rc = get_filemap( &fmap, fd, length );
	if ( 0 == rc )
		print_filemap( &fmap );

	destroy_filemap( &fmap );

out:
	close( fd );

	return 0;
}
예제 #12
0
int sys_read(int fd, char* buffer, unsigned length)
{
    if (fd == STDOUT_FILENO)
        return -1; // Vi kan inte läsa från skärmen

    unsigned i = 0;
    char key;
    for (i = 0; i != length; i++)
    {
        if (fd == STDIN_FILENO) // Tangentbord
        {
            key = (char)input_getc();

            if (key == '\r') // enter
            {
                key = '\n'; // lägg till ny rad-tecken
                buffer[i] = key;
                break;
            }
            else
                buffer[i] = key;

            putbuf(&buffer[i], 1);
        }
        else
        {
            //Read from file
            struct file* read_from = map_find(get_filemap(), fd);

            if(read_from != NULL && length > 0)
                return file_read(read_from, buffer, length);
            else
                return -1;
        }
    }

    return length; // Så här många tecken läste jag
}