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; }
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; }
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; }