Subversion Repositories HelenOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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. }
  66.