]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/ferret/server/sensor_directory/dir.c
update
[l4.git] / l4 / pkg / ferret / server / sensor_directory / dir.c
1 /**
2  * \file   ferret/server/sensor_directory/dir.c
3  * \brief  Directory server, serves as well known instance and
4  *         naming service for sensors
5  *
6  * \date   04/11/2005
7  * \author Martin Pohlack  <mp26@os.inf.tu-dresden.de>
8  */
9 /*
10  * (c) 2005-2009 Technische Universität Dresden
11  * This file is part of TUD:OS and distributed under the terms of the
12  * GNU General Public License 2.
13  * Please see the COPYING-GPL-2 file for details.
14  */
15 //#include <l4/dm_generic/dm_generic.h>
16 //#include <l4/dm_phys/dm_phys.h>
17 #include <l4/l4vfs/tree_helper.h>
18 #include <l4/l4vfs/name_server.h>
19 #include <l4/l4vfs/name_space_provider.h>
20 #include <l4/log/l4log.h>
21 #include <l4/names/libnames.h>
22 #include <l4/util/l4_macros.h>
23 #include <l4/util/parse_cmd.h>
24 #include <l4/util/util.h>
25
26 #include <l4/ferret/ferret_dir-server.h>
27 #include <l4/ferret/sensors/tbuf.h>
28
29 #include <stdlib.h>
30
31 #include "sensors.h"
32
33 char LOG_tag[9] = FERRET_DIR_NAME;
34 int verbose;
35 int reg_l4vfs;
36 l4vfs_th_node_t * root;
37
38 #define MIN ((a)<(b)?(a):(b))
39
40 int main(int argc, const char *argv[])
41 {
42     object_id_t root_id;
43     l4dm_dataspace_t ds = L4DM_INVALID_DATASPACE;
44     int i, ret;
45     sensor_entry_t * se;
46     CORBA_Server_Environment env = dice_default_server_environment;
47
48     if (parse_cmdline(&argc, &argv,
49
50                       'v', "verbose",
51                       "be verbose by dumping progress information to via log",
52                       PARSE_CMD_SWITCH, 1, &verbose,
53
54                       'l', "l4vfs", "register volume_id at L4VFS' name_server",
55                       PARSE_CMD_SWITCH, 1, &reg_l4vfs,
56
57                       0, 0) != 0)
58     {
59         return 1;
60     }
61
62     // create root node for tree_helper
63     root = l4vfs_th_new_node("[ferret root]", L4VFS_TH_TYPE_DIRECTORY,
64                              NULL, NULL);
65
66     // register at L4VFS' name_server
67
68     if (reg_l4vfs)
69     {
70         l4_threadid_t ns;
71         root_id.volume_id = FERRET_L4VFS_VOLUME_ID;
72         root_id.object_id = 0;
73
74         ns = l4vfs_get_name_server_threadid();
75         if (l4_is_invalid_id(ns))
76         {
77             exit(1);
78         }
79         LOGd(verbose, "Got name_server thread_id ...");
80         for (i = 0; i < 3; i++)
81         {
82             ret = l4vfs_register_volume(ns, l4_myself(), root_id);
83             // register ok --> done
84             if (ret == 0)
85                 break;
86             else
87                 LOG("Error registering at name_server: %d, retrying ...", ret);
88             l4_sleep(500);
89         }
90         if (ret)
91         {
92             LOG("Could not register at name_server, gave up!");
93             exit(1);
94         }
95         LOGd(verbose, "Registered my volume_id at name_server.");
96     }
97
98     // register special sensors ...
99
100     // trace buffer
101     se = sensors_new_entry(&ds, FERRET_TBUF_MAJOR, FERRET_TBUF_MINOR,
102                            0, FERRET_TBUF, FERRET_PERMANENT, "", NULL);
103     if (! se)
104     {
105         LOG("Could not register trace buffer as sensor, ignored!");
106     }
107
108     env.malloc = (dice_malloc_func)malloc;
109     env.free = (dice_free_func)free;
110
111     LOGd(verbose, "Registering at names ...");
112     names_register(FERRET_DIR_NAME);
113
114     LOGd(verbose, "Starting server loop ...");
115     ferret_dir_server_loop(&env);
116 }