Subversion Repositories HelenOS

Rev

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

Rev Author Line No. Line
2394 konopa 1
/* Sending extended well formed messages to FS over
2
 * standard HelenOS message agrs and over shared buffer.
3
 */
4
 
5
/* Methods:
6
 * send_request:    forms and sends extended message to FS
7
 * unpack_message:  unpacks message to given message_params_t* structure
8
 */
9
 
10
 
11
#include <async.h>
12
#include <task.h>
13
#include "../fs/fs.h"
14
#include "message.h"
15
 
16
int send_request(int phoneid, ipcarg_t method, message_params_t *params, void *shared_buffer);
17
void unpack_message(message_params_t *message, ipc_call_t m_input, void *shared_buffer);
18
 
19
/* This method should be used by all callers of FS. Candidate at library function. */  
20
int send_request(int phoneid, ipcarg_t method, message_params_t *params, void *shared_buffer)
21
{
22
 
23
    int retval, shift;
24
    size_t size;
25
 
26
    size = sizeof(message_params_t);
27
    memset((void *)shared_buffer, 0, size);
28
 
29
    /* Setting 'buffered' parameters. */
30
    memcpy((void* )shared_buffer, (void *)(&params->nbytes), sizeof(unsigned int));
31
    shift = sizeof(unsigned int);
32
    memcpy((void *)(shared_buffer + shift), (void *)(&params->offset), sizeof(offset_t));
33
    shift += sizeof(offset_t);
34
    memcpy((void *)(shared_buffer + shift), (void *)(&params->fname), DIRSIZEX);
35
    params->fname[DIRSIZEX-1] = '\0';
36
    shift += DIRSIZEX * sizeof(char);
37
    memcpy((void *)(shared_buffer + shift), (void *)(&params->entry_number), sizeof(int));
38
 
39
    /* 'Most used' parameters will be pass in standart message parameters. */
40
    retval = async_req_3(phoneid, method, task_get_id(), params->fd, params->whence, NULL, NULL, NULL);
41
 
42
    return retval; 
43
}
44
 
45
/* Will be used by FS to unpacking incoming extended message. */
46
void unpack_message(message_params_t *message, ipc_call_t m_input, void *shared_buffer)
47
{
48
 
49
    int shift;
50
 
51
    /* Core message parameters. */
52
    message->id_task = IPC_GET_ARG1(m_input);
53
    message->fd = IPC_GET_ARG2(m_input);
54
    message->whence = IPC_GET_ARG3(m_input);
55
 
56
    /* Buffered parameters - extended. */
57
    memcpy((void *)&message->nbytes, (void *)(shared_buffer), sizeof(unsigned int));
58
    shift = sizeof(unsigned int);
59
    memcpy((void *)(&message->offset), (void *)(shared_buffer + shift), sizeof(offset_t));
60
    shift += sizeof(offset_t);
61
    memcpy((void *)(&message->fname), (void *)(shared_buffer + shift), DIRSIZEX);
62
    shift += DIRSIZEX * sizeof(char);
63
    memcpy((void *)(&message->entry_number), (void *)(shared_buffer + shift), sizeof(int));
64
 
65
}