2 * $Id: ortemanager.c,v 0.0.0.1 2003/10/07
4 * DEBUG: section Manager
6 * -------------------------------------------------------------------
8 * Open Real-Time Ethernet
10 * Copyright (C) 2001-2006
11 * Department of Control Engineering FEE CTU Prague, Czech Republic
12 * http://dce.felk.cvut.cz
13 * http://www.ocera.org
15 * Author: Petr Smolik petr@smoliku.cz
17 * Project Responsible: Zdenek Hanzalek
18 * --------------------------------------------------------------------
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2 of the License, or
23 * (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
34 #ifdef HAVE_INTTYPES_H
36 #if defined(PRIx32) && !defined(ORTE_PRI_HostId)
37 #define ORTE_PRI_HostId PRIx32
38 #define ORTE_PRI_AppId PRIx32
40 #endif /*HAVE_INTTYPES_H*/
42 #ifndef ORTE_PRI_HostId
43 #define ORTE_PRI_HostId x
44 #define ORTE_PRI_AppId x
48 #define main ortemanager_main
52 #ifndef CONFIG_ORTE_RT
55 static ORTEDomainProp dp;
56 static int32_t opt,domain=ORTE_DEFAULT_DOMAIN;
57 static Boolean orteDaemon=ORTE_FALSE;
58 static Boolean orteWinService=ORTE_FALSE;
59 static ORTEDomainAppEvents *events=NULL;
63 onMgrAppRemoteNew(const struct ORTEAppInfo *appInfo, void *param) {
64 printf("%s 0x%"ORTE_PRI_HostId"-0x%"ORTE_PRI_AppId" was accepted\n",
65 (appInfo->appId & 0x3)==MANAGER ? "manager" : "application",
66 appInfo->hostId,appInfo->appId);
71 onMgrAppDelete(const struct ORTEAppInfo *appInfo, void *param) {
72 printf("%s 0x%"ORTE_PRI_HostId"-0x%"ORTE_PRI_AppId" was deleted\n",
73 (appInfo->appId & 0x3)==MANAGER ? "manager" : "application",
74 appInfo->hostId,appInfo->appId);
77 #if defined(_WIN32) || defined(__CYGWIN__)
78 //Windows service support
79 void serviceDispatchTable(void); //forward declaration
80 void removeService(void); //forward declaration
81 void installService(void); //forward declaration
82 int managerInit(void) {
83 d=ORTEDomainMgrCreate(domain,&dp,events,ORTE_TRUE);
84 if (d==NULL) return -1;
87 int managerStart(void) {
88 ORTEDomainStart(d,ORTE_TRUE,ORTE_FALSE,ORTE_FALSE,ORTE_FALSE,ORTE_TRUE);
91 int managerStop(void) {
92 ORTEDomainMgrDestroy(d);
97 #ifdef CONFIG_ORTE_UNIX
98 #ifdef HAVE_SYS_STAT_H
99 #include <sys/stat.h> /* For umask() */
101 //Unix daemon support
102 void waitForEndingCommand(void) {
104 sigemptyset(&sigset);
105 sigaddset(&sigset, SIGINT);
106 sigaddset(&sigset, SIGTERM);
108 #ifdef HAVE_SIGWAITINFO
109 sigwaitinfo(&sigset, NULL);
110 #else /*HAVE_SIGWAITINFO*/
112 sigwait(&sigset, &sig);
113 #endif /*HAVE_SIGWAITINFO*/
116 static int daemonInit(void) {
119 if ((pid = fork()) < 0) {
123 exit(0); /* parent vanishes */
135 static void usage(void) {
136 printf("usage: ortemanager <parameters> \n");
137 printf(" -p, --peer <IPAdd:IPAdd:...> possible locations of fellow managers\n");
138 printf(" -k, --key <IPAdd:IPAdd:...> manualy assigned manager's keys\n");
139 printf(" -d, --domain <domain> working manager domain\n");
140 printf(" -v, --verbosity <level> set verbosity level SECTION, up to LEVEL:...\n");
141 printf(" examples: ORTEManager -v 51.7:32.5 sections 51 and 32\n");
142 printf(" ORTEManager -v ALL.7 all sections up to level 7\n");
143 printf(" -R, --refresh <s> refresh period in second(s)\n");
144 printf(" -P, --purge <s> purge time in second(s)\n");
145 printf(" -I, --metaMulticast <IPAdd> use multicast IPAddr for metatraffic comm.\n");
146 printf(" -t, --timetolive <number> time-to-live for multicast packets\n");
147 printf(" -L, --listen <IPAdd> IP address to listen on\n");
148 #ifdef CONFIG_ORTE_UNIX
149 printf(" -D, --daemon start program like daemon\n");
151 printf(" -E, --expiration <s> expiration time of manager in second(s)\n");
152 printf(" -e, --events register event system\n");
153 printf(" -l, --logfile <filename> set log file name\n");
154 printf(" -V, --version show version\n");
155 #if defined(_WIN32) || defined(__CYGWIN__)
156 printf(" -i, --install_service install service into service manager on Windows\n");
157 printf(" -r, --remove_service remove service from service manager on Windows\n");
159 printf(" -h, --help this usage screen\n");
162 int main(int argc,char *argv[]) {
163 #if defined HAVE_GETOPT_LONG || defined HAVE_GETOPT_LONG_ORTE
164 static struct option long_opts[] = {
167 { "domain",1,0, 'd' },
168 { "verbosity",1,0, 'v' },
169 { "refresh",1,0, 'R' },
170 { "purge",1,0, 'P' },
171 { "metaMulticast",1,0, 'I' },
172 { "timetolive",1,0, 't' },
173 { "listen",1,0, 'L' },
174 #ifdef CONFIG_ORTE_UNIX
175 { "daemon",1,0, 'D' },
177 { "expiration",1,0, 'E' },
178 { "events",0,0, 'e' },
179 { "logfile",1,0, 'l' },
180 { "version",0,0, 'V' },
181 { "install_service",0,0, 'i' },
182 { "remove_service",0,0, 'r' },
183 { "help", 0, 0, 'h' },
189 ORTEDomainPropDefaultGet(&dp);
191 #if defined HAVE_GETOPT_LONG || defined HAVE_GETOPT_LONG_ORTE
192 while ((opt = getopt_long(argc, argv, "k:p:d:v:R:E:P:I:t:L:l:VhDesir",&long_opts[0], NULL)) != EOF) {
194 while ((opt = getopt(argc, argv, "k:p:d:v:R:E:P:I:t:L:l:VhDesir")) != EOF) {
204 domain=strtol(optarg,NULL,0);
207 ORTEVerbositySetOptions(optarg);
210 NtpTimeAssembFromMs(dp.baseProp.refreshPeriod,strtol(optarg,NULL,0),0);
213 NtpTimeAssembFromMs(dp.baseProp.purgeTime,strtol(optarg,NULL,0),0);
216 dp.multicast.enabled=ORTE_TRUE;
217 dp.multicast.ipAddress=StringToIPAddress(optarg);
220 dp.listen=StringToIPAddress(optarg);
223 dp.multicast.ttl=strtol(optarg,NULL,0);
226 NtpTimeAssembFromMs(dp.baseProp.expirationTime,strtol(optarg,NULL,0),0);
229 events=(ORTEDomainAppEvents*)malloc(sizeof(ORTEDomainAppEvents));
230 ORTEDomainInitEvents(events);
231 events->onMgrNew=onMgrAppRemoteNew;
232 events->onAppRemoteNew=onMgrAppRemoteNew;
233 events->onMgrDelete=onMgrAppDelete;
234 events->onAppDelete=onMgrAppDelete;
237 ORTEVerbositySetLogFile(optarg);
240 printf("Open Real-Time Ethernet (%s).\n",dp.version);
244 orteDaemon=ORTE_TRUE;
246 #if defined(_WIN32) || defined(__CYGWIN__)
248 serviceDispatchTable();
253 orteWinService=ORTE_TRUE;
263 exit(opt == 'h' ? 0 : 1);
267 if (orteWinService) {
271 d=ORTEDomainMgrCreate(domain,&dp,events,ORTE_TRUE);
273 perror("ORTEDomainMgrCreate");
277 #ifdef CONFIG_ORTE_UNIX
282 ORTEDomainStart(d,ORTE_TRUE,ORTE_FALSE,ORTE_FALSE,ORTE_FALSE,ORTE_TRUE);
283 #ifndef CONFIG_ORTE_UNIX
284 while(1) ORTESleepMs(1000);
287 #ifdef CONFIG_ORTE_UNIX
288 waitForEndingCommand();
289 ORTEDomainMgrDestroy(d);
298 MODULE_PARM(verbosity,"1s");
299 MODULE_PARM_DESC(verbosity,"set verbosity level SECTION, up to LEVEL:...");
301 MODULE_PARM(peer,"1s");
302 MODULE_PARM_DESC(peer,"possible locations of fellow managers");
303 MODULE_LICENSE("GPL");
308 domainInit(void *arg) {
311 ORTEDomainPropDefaultGet(&dp);
312 ORTEVerbositySetOptions(verbosity);
314 d=ORTEDomainMgrCreate(ORTE_DEFAULT_DOMAIN,&dp,NULL,ORTE_TRUE);
319 domainDestroy(void *arg) {
321 ORTEDomainMgrDestroy(d);
328 pthread_create(&thread,NULL,&domainInit,NULL); //allocate resources in RT
329 pthread_join(thread,NULL);
331 ORTEDomainStart(d,ORTE_TRUE,ORTE_FALSE,ORTE_FALSE,ORTE_FALSE,ORTE_TRUE); //manager start
335 cleanup_module(void) {
337 pthread_create(&thread,NULL,&domainDestroy,NULL);
338 pthread_join(thread,NULL);