0ad273c88c56cdb02a0da79964a5c531d1acb8e9
[rahunas] / src / rh-server.c
1 /**
2  * RahuNAS server
3  * Author: Neutron Soutmun <neo.neutron@gmail.com>
4  * Date:   2009-03-24
5  */
6 #include <stdio.h>
7 #include "rahunasd.h"
8 #include "rh-server.h"
9 #include "rh-utils.h"
10
11 int vserver_exists(GList *vserver_list, int vserver_id, 
12                    const char *vserver_name)
13 {
14   GList *runner = g_list_first(vserver_list);
15   struct vserver *lvserver = NULL;
16
17   while (runner != NULL) {
18     lvserver = (struct vserver *)runner->data;
19    
20     if (lvserver->vserver_config->vserver_id == vserver_id)
21       return 1; 
22
23     if (strcmp(lvserver->vserver_config->vserver_name, vserver_name) == 0)
24       return 2;
25
26     runner = g_list_next(runner); 
27   } 
28   return 0;
29 }
30
31 struct vserver *vserver_get_by_id(struct main_server *ms, int search_id)
32 {
33   GList *runner = g_list_first(ms->vserver_list);
34   struct vserver *lvserver = NULL;
35
36   while (runner != NULL) {
37     lvserver = (struct vserver *)runner->data;
38    
39     if (lvserver->vserver_config->vserver_id == search_id) {
40       return lvserver;
41     }
42
43     runner = g_list_next(runner); 
44   } 
45   return NULL;
46 }
47
48 int vserver_cleanup(struct vserver *vs)
49 {
50   if (vs == NULL)
51     return 0;
52
53   if (vs->vserver_config != NULL)
54     cleanup_vserver_config(vs->vserver_config);  
55
56   if (vs->v_map != NULL)
57     // TODO: cleanup map
58
59   if (vs->v_set != NULL)
60     // TODO: cleanup set
61
62   return 0;
63 }
64
65 int mainserver_cleanup(struct main_server *ms)
66 {
67   if (ms == NULL)
68     return 0;
69
70   if (ms->main_config != NULL)
71     cleanup_mainserver_config(ms->main_config);  
72
73   return 0;
74 }
75
76 int register_vserver(struct main_server *ms, const char *vserver_cfg_file)
77 {
78   GList *vserver_list = ms->vserver_list;
79   GList *chk = NULL;
80   GList *node = NULL;
81   FILE  *cfg_file = NULL;
82   
83   union rahunas_config *cfg_get = NULL;
84   struct rahunas_vserver_config *vserver_config = NULL;
85   struct vserver *new_vserver = NULL;
86
87   union rahunas_config config = {
88     .rh_vserver.vserver_id = VSERVER_ID,
89     .rh_vserver.vserver_ip = NULL, 
90     .rh_vserver.vserver_name = NULL,
91     .rh_vserver.idle_timeout = IDLE_TIMEOUT,
92   };
93
94   cfg_file = fopen(vserver_cfg_file, "r");
95   if (cfg_file == NULL)
96     return -1;
97
98   vserver_config = (struct rahunas_vserver_config *) rh_malloc(sizeof(struct rahunas_vserver_config));
99
100   if (vserver_config == NULL)
101     return -1;
102
103   memset(vserver_config, 0, sizeof(struct rahunas_vserver_config));
104
105   if (get_config(vserver_cfg_file, &config) != 0) {
106     rh_free(&config.rh_vserver.vserver_ip);
107     return -1;
108   }
109
110   memcpy(vserver_config, &config, sizeof(struct rahunas_vserver_config));
111
112   if (vserver_exists(vserver_list, vserver_config->vserver_id, 
113                      vserver_config->vserver_name)) {
114     return 1;
115   }
116
117   new_vserver = (struct vserver *) rh_malloc(sizeof(struct vserver));
118
119   if (new_vserver == NULL)
120     return -1;
121
122   memset(new_vserver, 0, sizeof(struct vserver));
123
124   new_vserver->vserver_config = vserver_config;
125
126   ms->vserver_list = g_list_append(ms->vserver_list, new_vserver);
127   return 0; 
128 }
129
130 int unregister_vserver(struct main_server *ms, int vserver_id)
131 {
132 }
133
134 int unregister_vserver_all(struct main_server *ms)
135 {
136   GList *vserver_list = ms->vserver_list;
137   GList *runner = g_list_first(vserver_list);
138   struct vserver *lvserver = NULL;
139
140   while (runner != NULL) {
141     lvserver = (struct vserver *)runner->data;
142     vserver_cleanup(lvserver);
143     runner = g_list_delete_link(runner, runner);
144   }
145   
146   return 0;
147 }
148
149 int walk_through_vserver(int (*callback)(void *, void *), struct main_server *ms)
150 {
151   GList *vserver_list = ms->vserver_list;
152   GList *runner = g_list_first(vserver_list);
153   struct vserver *vs = NULL;
154
155   while (runner != NULL) {
156     vs = (struct vserver *)runner->data;
157
158     (*callback)(ms, vs);
159
160     runner = g_list_next(runner); 
161   } 
162
163   return 0;
164 }