Subversion Repositories HelenOS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

/* Sending extended well formed messages to FS over 
 * standard HelenOS message agrs and over shared buffer.
 */

/* Methods:
 * send_request:    forms and sends extended message to FS
 * unpack_message:  unpacks message to given message_params_t* structure
 */


#include <async.h>
#include <task.h>
#include "../fs/fs.h"
#include "message.h"

int send_request(int phoneid, ipcarg_t method, message_params_t *params, void *shared_buffer);
void unpack_message(message_params_t *message, ipc_call_t m_input, void *shared_buffer);

/* This method should be used by all callers of FS. Candidate at library function. */   
int send_request(int phoneid, ipcarg_t method, message_params_t *params, void *shared_buffer)
{
    
    int retval, shift;
    size_t size;
    
    size = sizeof(message_params_t);
    memset((void *)shared_buffer, 0, size);
    
    /* Setting 'buffered' parameters. */
    memcpy((void* )shared_buffer, (void *)(&params->nbytes), sizeof(unsigned int));
    shift = sizeof(unsigned int);
    memcpy((void *)(shared_buffer + shift), (void *)(&params->offset), sizeof(offset_t));
    shift += sizeof(offset_t);
    memcpy((void *)(shared_buffer + shift), (void *)(&params->fname), DIRSIZEX);
    params->fname[DIRSIZEX-1] = '\0';
    shift += DIRSIZEX * sizeof(char);
    memcpy((void *)(shared_buffer + shift), (void *)(&params->entry_number), sizeof(int));
    
    /* 'Most used' parameters will be pass in standart message parameters. */
    retval = async_req_3(phoneid, method, task_get_id(), params->fd, params->whence, NULL, NULL, NULL); 

    return retval;  
}

/* Will be used by FS to unpacking incoming extended message. */
void unpack_message(message_params_t *message, ipc_call_t m_input, void *shared_buffer)
{
    
    int shift;

    /* Core message parameters. */
    message->id_task = IPC_GET_ARG1(m_input); 
    message->fd = IPC_GET_ARG2(m_input);
    message->whence = IPC_GET_ARG3(m_input);

    /* Buffered parameters - extended. */
    memcpy((void *)&message->nbytes, (void *)(shared_buffer), sizeof(unsigned int));
    shift = sizeof(unsigned int);
    memcpy((void *)(&message->offset), (void *)(shared_buffer + shift), sizeof(offset_t));
    shift += sizeof(offset_t);
    memcpy((void *)(&message->fname), (void *)(shared_buffer + shift), DIRSIZEX);
    shift += DIRSIZEX * sizeof(char);
    memcpy((void *)(&message->entry_number), (void *)(shared_buffer + shift), sizeof(int));

}