Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2388 → Rev 2389

/branches/fs/uspace/cat/cat.c
8,35 → 8,226
#include <string.h>
#include <unistd.h>
#include <async.h>
#include <align.h>
#include <as.h>
#include <ipc/ipc.h>
#include <ipc/services.h>
#include <sys/mman.h>
#include "../fs/fs.h"
#include "../share/shared_proto.h"
#include "../console/console.h"
 
#define CON_FS_ATTEMPTS 1000
 
static int fs_phone;
 
int main(int argc, char *argv[])
{
//Why does my console have no number?
printf("This is your cat! \n");
 
char * fname = "version";
char * buff = "012345678901234567890123456789012";
char fname[30];
unsigned int file_handle;
int retval, flags, entry;
unsigned short entries_num, inode_num;
size_t size;
void *share = NULL;
 
int fs_phone;
printf("Cat task\n");
 
fs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_FS, 0);
while (fs_phone < 0) {
usleep(10000);
fs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_FS, 0);
printf("Connecting to the SERVICE_FS...");
if (!connect_to_fs(&fs_phone, CON_FS_ATTEMPTS)) {
printf("Connection to SERVICE_FS was refused\n");
return -1;
}
printf("OK\n");
printf("Creating address space area...");
size = ALIGN_UP(BLOCK_SIZE * sizeof(char), PAGE_SIZE);
share = mmap(share, size, AS_AREA_READ | AS_AREA_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0);
if ((int)share < 0){
printf("As_area_create error: %d\n", (int)share);
return -1;
}
printf("OK\n");
 
file_handle = async_req_2(fs_phone, FS_OPEN, (unsigned int) fname, 0, NULL, NULL);
printf("Connecting the task to FS...");
retval = async_req_2(fs_phone, FS_NEW_CONSUMER, task_get_id(), 0, NULL, NULL);
if (retval < 0) {
printf("FS_NEW_CONSUMER error: %d\n", retval);
return -1;
}
printf("OK\n");
 
printf("I got file handle %d \n",file_handle);
printf("Sending memory to FS_SERVICE...");
flags = 0;
flags = AS_AREA_READ | AS_AREA_WRITE;
retval = async_req_3(fs_phone, IPC_M_AS_AREA_SEND, (uintptr_t)share, size, flags, NULL, NULL, NULL);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
/* Allocating structure for extended message. */
message_params_t *params;
params = malloc(sizeof(message_params_t));
memset((void*)params, 0, sizeof(message_params_t));
 
char * retval = (char * ) async_req_3(fs_phone, FS_READ, file_handle, (unsigned int) buff, 32, NULL, NULL, NULL);
/* We want lookup our work directory. */
printf("Request for get number of entries...");
retval = send_request(fs_phone, FS_DSUM, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
printf("Total number of entries: %d\n", retval);
entries_num = retval;
 
printf("Data read: %d\n", retval);
/* File list in working directory. */
printf("File list:\n");
for (entry = 0; entry < entries_num; entry++) {
 
params->entry_number = entry;
retval = send_request(fs_phone, FS_READENTRY, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
/*
if (retval < sizeof(unsigned short))
continue;
*/
memcpy(&inode_num, share, sizeof(unsigned short));
memcpy(fname, (void *)(share+sizeof(unsigned short)), retval-sizeof(unsigned short));
 
/* Do not show empty entries. */
if (!inode_num)
continue;
printf("Inode number: %u\t\t", inode_num);
printf("File name: %s\n", fname);
}
printf("OK\n");
/* We want to change working directory */
memcpy(fname, "uspace/fs", 10);
memcpy(params->fname, fname, 10);
 
printf("Request for changing actual directory to %s...", fname);
retval = send_request(fs_phone, FS_CHDIR, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
 
/* We want to work with specified file. */
memcpy(fname, "fs.c", 10);
memcpy(params->fname, fname, 10);
 
printf("Request for opening file %s...", fname);
retval = send_request(fs_phone, FS_OPEN, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
 
file_handle = retval;
printf("Returned file handle...%d\n", file_handle);
memcpy(params->fname, fname, 10);
params->fd = file_handle;
 
printf("Request for getting info about file %s[FSTAT called]...", fname);
retval = send_request(fs_phone, FS_FSTAT, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
params->fd = file_handle;
params->offset = 100;
params->whence = 1; /* from actual position in the file */
 
printf("Request for seeking after %d bytes inside file %s...", params->offset, fname);
retval = send_request(fs_phone, FS_SEEK, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
 
printf("New file position is: %d\n", retval);
params->nbytes = 100;
printf("Request for reading %d bytes from file %s...", params->nbytes, fname);
retval = send_request(fs_phone, FS_READ, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
printf("%d bytes was read into buffer\n", retval);
printf("\nContent of the buffer:\n");
printf(share);
printf("\n\n");
params->offset = 0;
params->whence = 0; /* from beginning of the file */
 
printf("Request for seeking after %d bytes inside file %s...", params->offset, fname);
retval = send_request(fs_phone, FS_SEEK, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
 
printf("New file position is: %d\n", retval);
params->fd = file_handle;
params->nbytes = 50;
 
printf("Another request for reading %d bytes from file %s...", params->nbytes, fname);
retval = send_request(fs_phone, FS_READ, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
 
printf("%d bytes was read into buffer\n", retval);
printf("\nContent of the buffer:\n");
printf(share);
printf("\n\n");
 
 
printf("Request for closing file %s...", fname);
retval = send_request(fs_phone, FS_CLOSE, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
printf("Request for closing file %s once more...", fname);
retval = send_request(fs_phone, FS_CLOSE, params, share);
if (retval < 0) {
printf("%d\n", retval);
return -1;
}
printf("OK\n");
 
return 0;
}
 
/branches/fs/uspace/cat/cat.h
0,0 → 1,2
/* Cat.h */