Merge branch 'ohligs' into readwrite

Conflicts:
	newlib/examples/hello.c
This commit is contained in:
Marian Ohligs 2011-05-23 12:59:10 +02:00
commit ec6ccf9c3a
8 changed files with 76 additions and 38 deletions

View file

@ -43,6 +43,16 @@ extern "C" {
*/
void keyboard_init(void);
typedef struct
{
char* buffer;
size_t maxsize;
size_t size;
tid_t tid;
} kb_buffer_t;
kb_buffer_t kb_buffer;
#endif
#ifdef __cplusplus

View file

@ -24,6 +24,16 @@
#ifdef CONFIG_KEYBOARD
kb_buffer_t kb_buffer = {NULL, 0, 0, 0 };
kb_flush() {
kfree(kb_buffer.buffer, (kb_buffer.maxsize * sizeof(char)));
kb_buffer.buffer = NULL;
kb_buffer.size = 0;
kb_buffer.maxsize = 0;
kb_buffer.tid = 0;
}
/*
* KBDUS means US Keyboard Layout. This is a scancode table
* used to layout a standard US keyboard. I have left some
@ -99,6 +109,15 @@ static void keyboard_handler(struct state *r)
* you would add 128 to the scancode when you look for it
*/
kputchar(kbdus[scancode]);
if (kb_buffer.size <= kb_buffer.maxsize) {
memcpy(kb_buffer.buffer + kb_buffer.size, &kbdus[scancode], 1);
kb_buffer.size++;
}
if (scancode == 28 || scancode == 15 || kb_buffer.size >= kb_buffer.maxsize) {
wakeup_task(kb_buffer.tid);
reschedule();
}
}
}

View file

@ -23,14 +23,27 @@
#include <metalsvm/errno.h>
#include <metalsvm/fs.h>
#include <metalsvm/spinlock.h>
#include <asm/kb.h>
/* Implementation of a simple stdin device */
static ssize_t stdin_read(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset)
{
while(size) {
size -= kputs((char*)buffer);
}
kb_buffer.buffer = kmalloc(size * sizeof(char));
kb_buffer.maxsize = size;
kb_buffer.size = 0;
kb_buffer.tid = per_core(current_task)->id;
block_task(per_core(current_task)->id);
reschedule();
size = kb_buffer.size;
memcpy(buffer, kb_buffer.buffer, size);
/*cleaning up */
kb_flush();
//kprintf("Size: %i, offset: %i, buffer: %s", size, buffer, offset);
return size;
}

View file

@ -144,7 +144,6 @@ static ssize_t initrd_write(vfs_node_t* node, uint8_t* buffer, size_t size, off_
* for the next block.
*/
memcpy(data + offset, buffer, size);
return size;
}

View file

@ -37,6 +37,31 @@
//#define FS_SYMLINK 0x06
//#define FS_MOUNTPOINT 0x08 // Is the file an active mountpoint?
/*open flags*/
#define O_RDONLY 0
#define O_WRONLY 1
#define O_RDWR 2
#define O_CREAT 64
#define O_EXCL 128
#define O_NOCTTY 256
#define O_TRUNC 512
#define O_APPEND 1024
#define O_NDELAY 2048
#define O_SYNC 4096
#define O_ASYNC 8192
/*lseek defines*/
#ifndef SEEK_SET
#define SEEK_SET 0 /* set file offset to offset */
#endif
#ifndef SEEK_CUR
#define SEEK_CUR 1 /* set file offset to current plus offset */
#endif
#ifndef SEEK_END
#define SEEK_END 2 /* set file offset to EOF plus offset */
#endif
struct vfs_node;
/** @defgroup fsprototypes FS access function prototypes

View file

@ -23,16 +23,6 @@
* @brief Stringstream related functions. Mainly printf-stuff.
*/
#ifndef SEEK_SET
#define SEEK_SET 0 /* set file offset to offset */
#endif
#ifndef SEEK_CUR
#define SEEK_CUR 1 /* set file offset to current plus offset */
#endif
#ifndef SEEK_END
#define SEEK_END 2 /* set file offset to EOF plus offset */
#endif
#ifndef __STDIO_H__
#define __STDIO_H__

View file

@ -77,7 +77,8 @@ static int sys_lseek(int fd, off_t pos, int origin)
{
int ret = -EINVAL;
/* Beware: still not checking the filetype & size*/
if (BUILTIN_EXPECT(per_core(current_task)->fildes_table[fd].node->type != FS_FILE, 0))
return -EINVAL;
switch(origin)
{

View file

@ -28,28 +28,9 @@ extern int errno;
int main(int argc, char** argv)
{
int i;
long offset_x = 5;
char* str = (char *)malloc(50 * sizeof(char));
FILE* testfile;
testfile = fopen("/bin/test", "w+r");
setbuf(testfile, NULL);
char* str = (char *)malloc(40000 * sizeof(char));
scanf("%s", str);
printf("SCANF: %s", str);
fflush(NULL);
fwrite("wsx", 3, 1, testfile);
fseek(testfile, 2, SEEK_CUR);
fwrite("nextnextnext", 1, 10, testfile);
fclose(testfile);
testfile = fopen("/bin/test", "w+r");
setbuf(testfile, NULL);
fread(str, 2, 40, testfile);
printf("reading (/bin/test):%s\n", str);
testfile = fopen("/bin/test", "w+r");
setbuf(testfile, NULL);
fread(str, 1, 10, testfile);
fwrite("wtest1\n", 1, 7, testfile);
fread(str, 1, 10, testfile);
return errno;
return errno;
}