Пример #1
0
static int open_fifofs(struct vfs_node_t* node, int oflag, mode_t mode)
{
	(void)mode;

	struct fifofs_hdr_t* hdr = fifofs_nodes[node->status.st_ino];

	/* POSIX leaves behavior undefined when using O_RDWR, so we treat
	 * it as O_RDONLY */
	if ((oflag & O_ACCMODE) == O_RDWR)
		oflag &= ~O_WRONLY; /* Remove writable flag */

	if (oflag & O_RDONLY) /* Opening the read end */
	{
		hdr->readers++;

		/* Do not block if we are in non-blocking mode */
		if (!(oflag & O_NONBLOCK))
		{
			/* Wait until there is a writer */
			while(hdr->writers < 1)
				sched_switch();
		}

		/* Now we have a writer so we can return */
		return get_free_fd(3);
	}
	else if (oflag & O_WRONLY) /* Opening the write end */
	{
		hdr->writers++;

		/* Wait until there is a reader */
		while(hdr->readers < 1)
		{
			/* Or fail if we are in non-blocking mode */
			if (oflag & O_NONBLOCK)
			{
				errno = ENXIO;
				return -1;
			}

			sched_switch();
		}

		/* Now we have a reader -> return */
		return get_free_fd(3);
	}
	else
		return -1;
}
Пример #2
0
fd_t Ext2FS::open(const char * path, const char * mode)
{
	fd_t new_fd = get_free_fd();
	if(new_fd < 0)
		return -1;
	mark_fd_as_used(new_fd);

	// We ignore mode
	struct Ext2FSInode * inode = inode_for_path(path);
	assert(inode != NULL);
	std::cerr << *inode << std::endl;

	if(inode == NULL)
		return -1;

	_open_files[new_fd] = *inode;
	delete inode;
	_seek_memory[new_fd] = 0;

	return new_fd;
}
Пример #3
0
int sfs_fopen(char *name) 
{
    int inode_num, fd, i; 
    inode_struct* inode;
    directory_map new_file;
    
    inode_num = get_inode_num_by_name(name);
    
    // Check if file is already open
    for(i = 1; i < MAXOPENFILES; i++) {
        if( (fd_table[i].status == USED) && (fd_table[i].inode_num == inode_num)) return i;
    }
    
    fd = get_free_fd();
    if(fd == -1) return -1;
        
    if(inode_num == -1) // File does not exist, create file 
    {
        // Allocate i-node
        inode_num = get_free_inode_num();
        inode = calloc(1, sizeof(inode_struct));
        
        // Add new file to directory
        new_file.inode_num = inode_num;
        strcpy(new_file.file_name, name);
        
        // Seek to end of directory and write new file entry
        fd_table[ROOTFD].rw_pointer = fd_table[ROOTFD].inode->size;
        sfs_fwrite(ROOTFD, (char*)&new_file, sizeof(directory_map));
        write_inode_by_index(fd_table[ROOTFD].inode_num, fd_table[ROOTFD].inode);
    } else {
        inode = get_inode_by_index(inode_num);
    } 
    
    fd_table[fd].inode_num = inode_num;
    fd_table[fd].inode = inode;
    fd_table[fd].rw_pointer = inode->size;
    
    return fd;
}