Beispiel #1
0
int ln_cmd(int argc, char **argv) {
    if (argc != 2) {
        printf("ln: missing file operand\n");
        return 0;
    }
    u32int currentiNode = tty_getCurrentTTY()->currDirectory;
    fs_node_t currentFsNode;
    fs_getFsNode(&currentFsNode, currentiNode);
    fs_node_t *target = finddir_fs(&currentFsNode, argv[0]);
    if (target == NULL) {
        printf("ln: accessing \"%s\": No such file or directory\n", argv[0]);
        return -1;
    }
    // create sym link
    u32int symLinkiNode = createdir_fs(&currentFsNode, argv[1], FS_SYMLINK);
    if (symLinkiNode == E_FILE_EXISTS) {
        printf("ln: accessing \"%s\": File exists\n", argv[1]);
        return -1;
    }
    fs_node_t symLink;
    fs_getFsNode(&symLink, symLinkiNode);
    // add contents to sym link
    //write_fs(&symLink, 0, sizeof(u32int), (u8int*) &target->inode);
    write_fs(&symLink, 0, MAX_NAME_LENGTH, (u8int*) target->name);
    kfree(target);
    return 0;
}
Beispiel #2
0
static int sys_write(int fd, char * ptr, int len) {
    if (FD_CHECK(fd)) {
        PTR_VALIDATE(ptr);
        fs_node_t * node = FD_ENTRY(fd);
        uint32_t out = write_fs(node, node->offset, len, (uint8_t *)ptr);
        node->offset += out;
        return out;
    }
    return -1;
}
Beispiel #3
0
static int sys_write(int fd, char * ptr, int len) {
	if (FD_CHECK(fd)) {
		PTR_VALIDATE(ptr);
		fs_node_t * node = FD_ENTRY(fd);
		if (!has_permission(node, 02)) {
			debug_print(WARNING, "access denied (write, fd=%d)", fd);
			return -EACCES;
		}
		uint32_t out = write_fs(node, node->offset, len, (uint8_t *)ptr);
		node->offset += out;
		return out;
	}
	return -1;
}
Beispiel #4
0
static int sys_write(int fd, char * ptr, int len) {
	if (FD_CHECK(fd)) {
		PTR_VALIDATE(ptr);
		fs_node_t * node = FD_ENTRY(fd);
		if (!(FD_MODE(fd) & 02)) {
			debug_print(WARNING, "access denied (write, fd=%d)", fd);
			return -EACCES;
		}
		uint32_t out = write_fs(node, FD_OFFSET(fd), len, (uint8_t *)ptr);
		FD_OFFSET(fd) += out;
		return out;
	}
	return -EBADF;
}
Beispiel #5
0
void mouse_handler(struct regs *r) {
	uint8_t status = inportb(MOUSE_STATUS);
	while (status & MOUSE_BBIT) {
		int8_t mouse_in = inportb(MOUSE_PORT);
		if (status & MOUSE_F_BIT) {
			switch (mouse_cycle) {
				case 0:
					mouse_byte[0] = mouse_in;
					if (!(mouse_in & MOUSE_V_BIT)) return;
					++mouse_cycle;
					break;
				case 1:
					mouse_byte[1] = mouse_in;
					++mouse_cycle;
					break;
				case 2:
					mouse_byte[2] = mouse_in;
					/* We now have a full mouse packet ready to use */
					if (mouse_byte[0] & 0x80 || mouse_byte[0] & 0x40) {
						/* x/y overflow? bad packet! */
						break;
					}
					mouse_device_packet_t packet;
					packet.magic = MOUSE_MAGIC;
					packet.x_difference = mouse_byte[1];
					packet.y_difference = mouse_byte[2];
					packet.buttons = 0;
					if (mouse_byte[0] & 0x01) {
						packet.buttons |= LEFT_CLICK;
					}
					if (mouse_byte[0] & 0x02) {
						packet.buttons |= RIGHT_CLICK;
					}
					if (mouse_byte[0] & 0x04) {
						packet.buttons |= MIDDLE_CLICK;
					}
					mouse_cycle = 0;

					mouse_device_packet_t bitbucket;
					while (pipe_size(mouse_pipe) > (DISCARD_POINT * sizeof(packet))) {
						read_fs(mouse_pipe, 0, sizeof(packet), (uint8_t *)&bitbucket);
					}
					write_fs(mouse_pipe, 0, sizeof(packet), (uint8_t *)&packet);
					break;
			}
		}
		status = inportb(MOUSE_STATUS);
	}
	irq_ack(MOUSE_IRQ);
}
Beispiel #6
0
static int serial_handler_ac(struct regs *r) {
	char serial;
	int  port = 0;
	if (inportb(SERIAL_PORT_A+1) & 0x01) {
		port = SERIAL_PORT_A;
	} else {
		port = SERIAL_PORT_C;
	}
	serial = serial_recv(port);
	irq_ack(SERIAL_IRQ_AC);
	uint8_t buf[] = {convert(serial), 0};
	write_fs(*pipe_for_port(port), 0, 1, buf);
	return 1;
}
Beispiel #7
0
static int serial_handler_bd(struct regs *r) {
	char serial;
	int  port = 0;
	debug_print(NOTICE, "Received something on secondary port");
	if (inportb(SERIAL_PORT_B+1) & 0x01) {
		port = SERIAL_PORT_B;
	} else {
		port = SERIAL_PORT_D;
	}
	serial = serial_recv(port);
	irq_ack(SERIAL_IRQ_BD);
	uint8_t buf[] = {convert(serial), 0};
	write_fs(*pipe_for_port(port), 0, 1, buf);
	return 1;
}
Beispiel #8
0
void keyboard_callback(registers_t *regs) {
  while(inb(PS2_COMMAND_PORT) & 2) {}
  uint8_t scan_code = inb(PS2_DATA_PORT);
  // TODO: send back RESEND if something was wrong.
  irq_ack(IRQ1);
  printk("scan_code found: %x\n", scan_code);
  // open '/dev/keyboard', write scan_code to it.
  // TODO: make this understand paths better.
  fs_node_t * keyboard = devfs_keyboard;
  if (keyboard) {
    printk("calling write_fs with %x %c\n", scan_code, scan_code);
    write_fs(keyboard, 0, 4, scan_code);
  } else {
    printk("ERROR: can't write to NULL /dev/keyboard char device.\n");
  }
}
Beispiel #9
0
int do_sys_write_flags(struct file *f, off_t off, char *buf, size_t count)
{
	if(!f || !buf)
		return -EINVAL;
	struct inode *inode = f->inode;
	if(S_ISFIFO(inode->mode))
		return write_pipe(inode, buf, count);
	else if(S_ISCHR(inode->mode))
		return char_rw(WRITE, inode->dev, buf, count);
	else if(S_ISBLK(inode->mode))
		return (block_device_rw(WRITE, inode->dev, off, buf, count));
	/* Again, we want to write to the link because we have that node */
	else if(S_ISDIR(inode->mode) || S_ISREG(inode->mode) || S_ISLNK(inode->mode))
		return write_fs(inode, off, count, buf);
	printk(1, "sys_write (%s): invalid mode %x\n", inode->name, inode->mode);
	return -EINVAL;
}
Beispiel #10
0
int DMTest2(int argc, char **argv) {
    char* fileName = "test";
    // rm_cmd(1, &fileName);
    fs_node_t root;
    fs_getRoot(&root);
    int inodeNumber = createdir_fs(&root, fileName, FS_FILE);
    if (inodeNumber == -1) {
        printf("file already exists\n");
    }
    fs_node_t* file = finddir_fs(&root, fileName);
    u8int* contents = (u8int*) "Hola Manolo!";
    u32int len = strlen((char*) contents) + 1;
    printf("writing contents...");
    // write_fs(file, 0, len, contents);
    int offset = 0;
    while(offset++ < len) {
        write_fs(file, offset, 1, contents + offset);
    }
    kfree(file);
    return 0;
}
Beispiel #11
0
int touch_cmd(int argc, char **argv) {
    if(argc == 0 ) {
        printf("touch: missing operand\n");
    } else {
        errno = 0;
        fs_node_t current;
		fs_getFsNode(&current, tty_getCurrentTTY()->currDirectory);
        createdir_fs(&current, argv[0], FS_FILE);
        char* err = NULL;
        switch(errno) {
            case OK:
                break;
            case E_ACCESS:
                err = "No write permission";
                break;
            case E_FILE_EXISTS:
                err = "File exists";
                break;
            default:
            	printf("errno: %d", errno);
                err = "Unknown error";
                break;
        }
        if (errno != 0) {
            printf("touch: cannot create file %s: %s\n", argv[0], err);
            return -1;
        }
        if (argc == 2) {
            TTY* tty = tty_getCurrentTTY();
            u32int currentiNode = tty->currDirectory;
            fs_node_t current;
            fs_getFsNode(&current, currentiNode);
            fs_node_t* file = finddir_fs(&current, argv[0]);
            write_fs(file, 0, strlen(argv[1]) + 1, (u8int*) argv[1]);
            kfree(file);
        }
    }
    return 0;
}
Beispiel #12
0
static int drv_stderr_write(vnode *node, off_t offset, size_t size, const char *buffer)
{
	FILE *f = current_task->files[STDERR_FILENO];
	if (!f || !f->node || f->node == node) return 0;
	return write_fs(f->node, offset, size, buffer);
}
Beispiel #13
0
int filewrite()
{
    char c;
    FILE * fp;
    unsigned int needed_block,file_size,buffcount=0;
	unsigned int tmp_offset,pos;

	int file_inode_index;
	inode *file_inode;

    data_block *buff;
    buff = (data_block *) malloc(sizeof(data_block));

	fp = fopen ("bigfile.txt", "rb");
    fseek(fp, 0, SEEK_END);
    file_size = ftell(fp);
    needed_block = ceil(file_size*1.0/(BS));

    if(sb_object->no_free_inodes < needed_block){
        printf("E: not enough memory");
        return 0;
    }

    fseek(fp, 0, SEEK_SET);
	// allocate inode
	file_inode_index = sb_object->next_free_inode_index;
	set_next_free_inode_index();
	// fill data inode
	file_inode = (inode *) &inode_table_object->inode_index[file_inode_index];
	file_inode->file_type = 0;
	file_inode->size = 0;


#ifdef DEBUG_BUILD
	printf("in write.c: ***file_size %d***\n",file_size);
#endif

    while((pos=ftell(fp))<=file_size){
		fread(&c,sizeof(char),1,fp);
		if(buffcount == BS || pos==file_size){
			tmp_offset = get_next_offset_to_write(file_inode);

#ifdef DEBUG_BUILD
	printf("*** db_block_write_offset(%d): %d  size: %d ***\n", buffcount, tmp_offset,file_inode->size);
			//printf("in write.c filewrite(): *** db_block_write_offset(%d): %d  size: %d ***\n", buffcount, tmp_offset,file_inode->size);
#endif

			my_write(buff,buffcount,tmp_offset);
			set_next_free_block();
			file_inode->size += buffcount;
			buffcount=0;
			write_fs();
		}
		if(pos!=file_size){
			buff->data[buffcount]=c;
			//printf("%d\n",buffcount);
			buffcount++;
		}else{
			break;
		}
	}
	
    free(buff);
    return file_inode_index;
}