comparison freeDiameter/main.c @ 8:3e143f047f78

Backup for the week-end
author Sebastien Decugis <sdecugis@nict.go.jp>
date Fri, 18 Sep 2009 18:54:07 +0900
parents ef303f1078ab
children fc7c18867cf7
comparison
equal deleted inserted replaced
7:e5af94b04946 8:3e143f047f78
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * 33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
34 *********************************************************************************************************/ 34 *********************************************************************************************************/
35 35
36 #include "fD.h" 36 #include "fD.h"
37 37
38 #include <signal.h>
39 #include <getopt.h>
40
41
42 /* Display package version */
43 static void main_version_core(void)
44 {
45 printf("%s, version %d.%d.%d"
46 #ifdef HG_VERSION
47 " (r%s"
48 # ifdef PACKAGE_HG_REVISION
49 "/%s"
50 # endif /* PACKAGE_HG_VERSION */
51 ")"
52 #endif /* HG_VERSION */
53 "\n",
54 FD_PROJECT_NAME, FD_PROJECT_VERSION_MAJOR, FD_PROJECT_VERSION_MINOR, FD_PROJECT_VERSION_REV
55 #ifdef HG_VERSION
56 , HG_VERSION
57 # ifdef PACKAGE_HG_REVISION
58 , PACKAGE_HG_REVISION
59 # endif /* PACKAGE_HG_VERSION */
60 #endif /* HG_VERSION */
61 );
62 }
63
64 /* Display package version and general info */
65 static void main_version(void)
66 {
67 main_version_core();
68 printf( "%s\n", FD_PROJECT_COPYRIGHT);
69 printf( "\nSee " FD_PROJECT_NAME " homepage at http://aaa.koganei.wide.ad.jp/\n"
70 " for information, updates and bug reports on this software.\n");
71 }
72
73 /* Print command-line options */
74 static void main_help( void )
75 {
76 main_version_core();
77 printf( " This daemon is an implementation of the Diameter protocol\n"
78 " used for Authentication, Authorization, and Accounting (AAA).\n");
79 printf("\nUsage: " FD_PROJECT_BINARY " [OPTIONS]...\n");
80 printf( " -h, --help Print help and exit\n"
81 " -V, --version Print version and exit\n"
82 " -c, --config=filename Read configuration from this file instead of the \n"
83 " default location (%s).\n", DEFAULT_CONF_FILE);
84 printf( "\nDebug:\n"
85 " These options are mostly useful for developers\n"
86 " -d, --debug Increase verbosity of debug messages\n"
87 " -q, --quiet Decrease verbosity then remove debug messages\n");
88 }
89
90 /* Parse the command-line */
91 static int main_cmdline(int argc, char *argv[])
92 {
93 int c;
94 int option_index = 0;
95
96 struct option long_options[] = {
97 { "help", 0, NULL, 'h' },
98 { "version", 0, NULL, 'V' },
99 { "config", 1, NULL, 'c' },
100 { "debug", 0, NULL, 'd' },
101 { "quiet", 0, NULL, 'q' },
102 { NULL, 0, NULL, 0 }
103 };
104
105 TRACE_ENTRY("%d %p", argc, argv);
106
107 /* Loop on arguments */
108 while (1) {
109 c = getopt_long (argc, argv, "hVc:dq", long_options, &option_index);
110 if (c == -1)
111 break; /* Exit from the loop. */
112
113 switch (c) {
114 case 'h': /* Print help and exit. */
115 main_help();
116 exit(0);
117
118 case 'V': /* Print version and exit. */
119 main_version();
120 exit(0);
121
122 case 'c': /* Read configuration from this file instead of the default location.. */
123 CHECK_PARAMS( optarg );
124 fd_g_config->conf_file = optarg;
125 break;
126
127 case 'd': /* Increase verbosity of debug messages. */
128 fd_g_debug_lvl++;
129 break;
130
131 case 'q': /* Decrease verbosity then remove debug messages. */
132 fd_g_debug_lvl--;
133 break;
134
135 case '?': /* Invalid option. */
136 /* `getopt_long' already printed an error message. */
137 TRACE_DEBUG(INFO, "getopt_long found an invalid character\n");
138 return EINVAL;
139
140 default: /* bug: option not considered. */
141 TRACE_DEBUG(INFO, "A command-line option is missing in parser: %c\n", c);
142 ASSERT(0);
143 return EINVAL;
144 }
145 }
146
147 return 0;
148
149 }
150
151 #ifdef HAVE_SIGNALENT_H
152 const char *const signalstr[] = {
153 # include "signalent.h"
154 };
155 const int nsignalstr = sizeof signalstr / sizeof signalstr[0];
156 # define SIGNALSTR(sig) (((sig) < nsignalstr) ? signalstr[(sig)] : "unknown")
157 #else /* HAVE_SIGNALENT_H */
158 # define SIGNALSTR(sig) ("")
159 #endif /* HAVE_SIGNALENT_H */
160
161
162 /* signal handler */
163 static void * sig_hdl(void * arg)
164 {
165 sigset_t sig_main;
166 int sig = 0;
167
168 TRACE_ENTRY();
169 fd_log_threadname("Main signal handler");
170
171 sigemptyset(&sig_main);
172 sigaddset(&sig_main, SIGINT);
173 sigaddset(&sig_main, SIGTERM);
174
175 CHECK_SYS_DO( sigwait(&sig_main, &sig), TRACE_DEBUG(INFO, "Error in sigwait function") );
176
177 TRACE_DEBUG(INFO, "Received signal %s (%d), exiting", SIGNALSTR(sig), sig);
178 CHECK_FCT_DO( fd_event_send(fd_g_config->g_fifo_main, FM_TERMINATE, NULL), exit(2) );
179 return NULL;
180 }
181
182 /* The static configuration structure */
183 static struct fd_config conf;
184 struct fd_config * fd_g_config = &conf;
185
38 /* Entry point */ 186 /* Entry point */
39 int main(int argc, char * argv[]) 187 int main(int argc, char * argv[])
40 { 188 {
189 int ret;
190 pthread_t sig_th;
191 sigset_t sig_all;
192
193 memset(fd_g_config, 0, sizeof(struct fd_config));
194 sigfillset(&sig_all);
195 CHECK_POSIX( pthread_sigmask(SIG_BLOCK, &sig_all, NULL) );
196
41 /* Initialize the library */ 197 /* Initialize the library */
42 CHECK_FCT( fd_lib_init() ); 198 CHECK_FCT( fd_lib_init() );
43 199
44 /* Name this thread */ 200 /* Name this thread */
45 fd_log_threadname("Main"); 201 fd_log_threadname("Main");
46 202
47 /* Initialize the dictionary */ 203 /* Initialize the config */
48 CHECK_FCT( fd_dict_init(&fd_g_dict) ); 204 CHECK_FCT( fd_conf_init() );
205
206 /* Parse the command-line */
207 CHECK_FCT( main_cmdline(argc, argv) );
208
209 /* Allow SIGINT and SIGTERM from this point */
210 CHECK_POSIX( pthread_create(&sig_th, NULL, sig_hdl, NULL) );
49 211
50 /* Add definitions of the base protocol */ 212 /* Add definitions of the base protocol */
51 CHECK_FCT( fd_dict_base_protocol(fd_g_dict) ); 213 CHECK_FCT( fd_dict_base_protocol(fd_g_config->g_dict) );
52 214
53 TRACE_DEBUG(INFO, "freeDiameter daemon initialized."); 215 /* Initialize other modules */
54 216 CHECK_FCT( fd_ext_init() );
55 return 0; 217
56 } 218 /* Parse the configuration file */
219 CHECK_FCT( fd_conf_parse() );
220
221 /* Load the dynamic extensions */
222 CHECK_FCT( fd_ext_load() );
223
224 /* Start the peer state machines */
225
226
227 /* Now, just wait for events */
228 TRACE_DEBUG(INFO, FD_PROJECT_BINARY " daemon initialized.");
229 fd_conf_dump();
230 while (1) {
231 int code;
232 CHECK_FCT_DO( fd_event_get(fd_g_config->g_fifo_main, &code, NULL), break );
233 switch (code) {
234 case FM_TERMINATE:
235 ret = 0;
236 goto end;
237
238 default:
239 TRACE_DEBUG(INFO, "Unexpected event in the daemon (%d), terminating.\n", code);
240 ret = -1;
241 goto end;
242 }
243 }
244
245 end:
246 TRACE_DEBUG(INFO, FD_PROJECT_BINARY " daemon is stopping...");
247
248 /* cleanups */
249 CHECK_FCT( fd_thr_term(&sig_th) );
250
251 return ret;
252 }
"Welcome to our mercurial repository"