Subversion Repositories HelenOS-historic

Rev

Rev 1330 | Rev 1336 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2006 Ondrej Palkovsky
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. /**
  30.  * @file    ns.c
  31.  * @brief   Naming service for HelenOS IPC.
  32.  */
  33.  
  34. #include <ipc.h>
  35. #include <stdio.h>
  36. #include <unistd.h>
  37. #include <stdlib.h>
  38. #include <ns.h>
  39. #include <errno.h>
  40. #include <assert.h>
  41. #include <libadt/list.h>
  42. #include <libadt/hash_table.h>
  43.  
  44. #define NAME    "NS"
  45.  
  46. #define NS_HASH_TABLE_CHAINS    20
  47.  
  48. /* Static functions implementing NS hash table operations. */
  49. static hash_index_t ns_hash(unsigned long *key);
  50. static int ns_compare(unsigned long *key, hash_count_t keys, link_t *item);
  51.  
  52. /** Operations for NS hash table. */
  53. static hash_table_operations_t ns_hash_table_ops = {
  54.     .hash = ns_hash,
  55.     .compare = ns_compare,
  56.     .remove_callback = NULL
  57. };
  58.  
  59. /** NS hash table structure. */
  60. static hash_table_t ns_hash_table;
  61.  
  62. /** NS hash table item. */
  63. typedef struct {
  64.     link_t link;
  65.     ipcarg_t service;       /**< Number of the service. */
  66.     ipcarg_t phone;         /**< Phone registered with the service. */
  67. } hashed_service_t;
  68.  
  69. /*
  70. irq_cmd_t msim_cmds[1] = {
  71.     { CMD_MEM_READ_1, (void *)0xB0000000, 0 }
  72. };
  73.  
  74. irq_code_t msim_kbd = {
  75.     1,
  76.     msim_cmds
  77. };
  78. */
  79. /*
  80. irq_cmd_t i8042_cmds[1] = {
  81.     { CMD_PORT_READ_1, (void *)0x60, 0 }
  82. };
  83.  
  84. irq_code_t i8042_kbd = {
  85.     1,
  86.     i8042_cmds
  87. };
  88. */
  89.  
  90.  
  91. int static ping_phone;
  92.  
  93. int main(int argc, char **argv)
  94. {
  95.     ipc_call_t call;
  96.     ipc_callid_t callid;
  97.     char *as;
  98.    
  99.     ipcarg_t retval, arg1, arg2;
  100.  
  101.     printf("%s: Name service started.\n", NAME);
  102.    
  103.     if (!hash_table_create(&ns_hash_table, NS_HASH_TABLE_CHAINS, 1, &ns_hash_table_ops)) {
  104.         printf("%s: cannot create hash table\n", NAME);
  105.         return ENOMEM;
  106.     }
  107.    
  108.    
  109. //  ipc_register_irq(2, &msim_kbd);
  110. //  ipc_register_irq(1, &i8042_kbd);
  111.     while (1) {
  112.         callid = ipc_wait_for_call(&call, 0);
  113.         printf("NS: Call phone=%lX...", call.phoneid);
  114.         switch (IPC_GET_METHOD(call)) {
  115.         case IPC_M_AS_SEND:
  116.             as = (char *)IPC_GET_ARG2(call);
  117.             printf("Received as: %P, size:%d\n", as, IPC_GET_ARG3(call));
  118.             retval = ipc_answer(callid, 0,(sysarg_t)(1024*1024), 0);
  119.             if (!retval) {
  120.                 printf("Reading shared memory...");
  121.                 printf("Text: %s", as);
  122.             } else
  123.                 printf("Failed answer: %d\n", retval);
  124.             continue;
  125.             break;
  126.         case IPC_M_INTERRUPT:
  127.             printf("GOT INTERRUPT: %c\n", IPC_GET_ARG2(call));
  128.             break;
  129.         case IPC_M_PHONE_HUNGUP:
  130.             printf("Phone hung up.\n");
  131.             retval = 0;
  132.             break;
  133.         case IPC_M_CONNECT_TO_ME:;
  134.             /*
  135.              * Request for registration of a service.
  136.              */
  137.             ipcarg_t service;
  138.             ipcarg_t phone;
  139.             hashed_service_t *hs;
  140.            
  141.             service = IPC_GET_ARG1(call);
  142.             phone = IPC_GET_ARG3(call);
  143.             printf("Registering service %d on phone %d...", service, phone);
  144.            
  145.             hs = (hashed_service_t *) malloc(sizeof(hashed_service_t));
  146.             if (!hs) {
  147.                 printf("Failed to register service %d.\n", service);
  148.             }
  149.            
  150.             link_initialize(&hs->link);
  151.             hs->service = service;
  152.             hs->phone = phone;
  153.             hash_table_insert(&ns_hash_table, (unsigned long *) &service, &hs->link);
  154.            
  155.             ping_phone = phone;
  156.             retval = 0;
  157.             break;
  158.         case IPC_M_CONNECT_ME_TO:
  159.             printf("Connectme(%P)to: %zd\n",
  160.                    IPC_GET_ARG3(call), IPC_GET_ARG1(call));
  161.             retval = 0;
  162.             break;
  163.         case NS_PING:
  164.             printf("Ping...%P %P\n", IPC_GET_ARG1(call),
  165.                    IPC_GET_ARG2(call));
  166.             retval = 0;
  167.             arg1 = 0xdead;
  168.             arg2 = 0xbeef;
  169.             break;
  170.         case NS_HANGUP:
  171.             printf("Closing connection.\n");
  172.             retval = EHANGUP;
  173.             break;
  174.         case NS_PING_SVC:
  175.             printf("NS:Pinging service %d\n", ping_phone);
  176.             ipc_call_sync(ping_phone, NS_PING, 0xbeef, 0);
  177.             printf("NS:Got pong\n");
  178.             break;
  179.         default:
  180.             printf("Unknown method: %zd\n", IPC_GET_METHOD(call));
  181.             retval = ENOENT;
  182.             break;
  183.         }
  184.         if (! (callid & IPC_CALLID_NOTIFICATION)) {
  185.             printf("Answering.\n");
  186.             ipc_answer(callid, retval, arg1, arg2);
  187.         }
  188.     }
  189. }
  190.  
  191. /** Compute hash index into NS hash table.
  192.  *
  193.  * @param key Pointer to single key (i.e. service number).
  194.  * @return Hash index corresponding to *key.
  195.  */
  196. hash_index_t ns_hash(unsigned long *key)
  197. {
  198.     assert(key);
  199.     return *key % NS_HASH_TABLE_CHAINS;
  200. }
  201.  
  202. /** Compare a key with hashed item.
  203.  *
  204.  * @param key Single key pointer.
  205.  * @param keys Must be 1.
  206.  * @param item Pointer to a hash table item.
  207.  * @return Non-zero if the key matches the item, zero otherwise.
  208.  */
  209. int ns_compare(unsigned long *key, hash_count_t keys, link_t *item)
  210. {
  211.     hashed_service_t *hs;
  212.  
  213.     assert(key);
  214.     assert(keys == 1);
  215.     assert(item);
  216.    
  217.     hs = hash_table_get_instance(item, hashed_service_t, link);
  218.    
  219.     return *key == hs->service;
  220. }
  221.