97126c782739978563ca36e9069c96fd5e946e85
[com/gs-lite.git] / src / lib / gscprts / rts_main.c
1 /* ------------------------------------------------
2  Copyright 2014 AT&T Intellectual Property
3  Licensed under the Apache License, Version 2.0 (the "License");
4  you may not use this file except in compliance with the License.
5  You may obtain a copy of the License at
6  
7  http://www.apache.org/licenses/LICENSE-2.0
8  
9  Unless required by applicable law or agreed to in writing, software
10  distributed under the License is distributed on an "AS IS" BASIS,
11  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  See the License for the specific language governing permissions and
13  limitations under the License.
14  ------------------------------------------- */
15
16 #include "gsconfig.h"
17 #include "gstypes.h"
18 #include "gshub.h"
19
20 #include "lapp.h"
21 #include "fta.h"
22 #include "lfta/rts.h"
23
24 #include "stdio.h"
25 #include "stdlib.h"
26 #include <sys/types.h>
27 #include <unistd.h>
28
29 #include <sys/ipc.h>
30 #include <sys/shm.h>
31 #include <fcntl.h>
32 #include <errno.h>
33 #include <sys/socket.h>
34
35 gs_retval_t main_csv(gs_int32_t devicenum, gs_sp_t device, gs_int32_t mapcnt, gs_sp_t map[]);
36 gs_retval_t main_csv2(gs_int32_t devicenum, gs_sp_t device, gs_int32_t mapcnt, gs_sp_t map[]);
37 gs_retval_t main_gdat(gs_int32_t devicenum, gs_sp_t device, gs_int32_t mapcnt, gs_sp_t map[]);
38
39 int main (int argc, char* argv[]) {
40     gs_int32_t pid;
41     gs_int32_t x;
42     gs_int32_t y;
43     gs_sp_t* device;
44     gs_int32_t devcnt=0;
45     gs_sp_t* mappings;
46     gs_int32_t mapcnt=0;
47     gs_sp_t* lmap;
48     gs_int32_t lmapcnt=0;
49     FILE * cfg_file;
50     gs_int32_t tip1,tip2,tip3,tip4;
51     endpoint gshub;
52     gs_sp_t instance_name;
53     
54     
55         gsopenlog(argv[0]);
56     
57     if (setpgid(0,0)<0) {
58         gslog(LOG_EMERG,"Could not set process group id of rts");
59         exit(1);
60     }
61         
62     if (argc<4) {
63                 gslog(LOG_EMERG,"Wrong arguments at startup");
64         exit(1);
65     }
66     
67     /* allocate more than enough for each array */
68     if ((device=(gs_sp_t*)malloc(sizeof(gs_sp_t*) * argc))==0) {
69         gslog(LOG_EMERG,"malloc error");
70         exit(1);
71     }
72     if ((mappings=(gs_sp_t*)malloc(sizeof(gs_sp_t*) * argc))==0) {
73         gslog(LOG_EMERG,"malloc error");
74         exit(1);
75     }
76     if ((lmap=(gs_sp_t*)malloc(sizeof(gs_sp_t*) * argc))==0) {
77         gslog(LOG_EMERG,"malloc error");
78         exit(1);
79     }
80     
81     /* parse the arguments */
82     
83     if ((sscanf(argv[1],"%u.%u.%u.%u:%hu",&tip1,&tip2,&tip3,&tip4,&(gshub.port))!=5)) {
84         gslog(LOG_EMERG,"HUB IP NOT DEFINED");
85         exit(1);
86     }
87     gshub.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);
88     gshub.port=htons(gshub.port);
89     instance_name=strdup(argv[2]);
90     if (set_hub(gshub)!=0) {
91         gslog(LOG_EMERG,"Could not set hub");
92         exit(1);
93     }
94     if (set_instance_name(instance_name)!=0) {
95         gslog(LOG_EMERG,"Could not set instance name");
96         exit(1);
97     }
98     
99     for(x=3;x<argc;x++) {
100         if (strncmp("-D",argv[x],2)==0) {
101             /* macro definition */
102             y=2;
103             while((y<(strlen(argv[x])-1))&&(argv[x][y]!='=')) y++;
104             
105             
106             if (y<(strlen(argv[x])-1)) {
107                 /* if that is not true the define is empty and
108                  we ignore it otherwise we set the = to 0 to
109                  make two strings out of it*/
110                 argv[x][y]=0;
111                 mappings[mapcnt]=&(argv[x][2]);
112                 mapcnt++;
113             }
114         } else {
115             /* device definition */
116             device[devcnt]=argv[x];
117             devcnt++;
118         }
119     }
120     
121     if (devcnt==0) {
122         gslog(LOG_EMERG,"at least one device has to be specified");
123         exit(1);
124     }
125         
126     
127     /* now startup all the device dependend processes. */
128     
129     for (x=0;x<devcnt;x++) {
130         if ((pid=fork())==-1) {
131             gslog(LOG_EMERG,"fork error");
132             exit(1);
133         }
134         
135         if (pid==0) {
136             gs_sp_t interfacetype;
137             /* wait for clearinghouse to finish startup */
138             sleep(2);
139             for(y=0;y<mapcnt;y++) {
140                 if (strcmp(device[x],&mappings[y][strlen(mappings[y])+1])==0) {
141                     /* point to the second string */
142                     lmap[lmapcnt]=mappings[y];
143                     lmapcnt++;
144                 }
145             }
146             /* the devicename always matches */
147             lmap[lmapcnt]=device[x];
148             lmapcnt++;
149             
150             if ((interfacetype=get_iface_properties(device[x],(gs_sp_t)"interfacetype"))==0) {
151                 gslog(LOG_EMERG,"Interface Type not configured but required");
152                 exit(1);
153             }
154             
155             if (strcmp(interfacetype,"CSV")==0) {
156                 main_csv(x,device[x],lmapcnt,lmap);           
157             } else {
158                         if (strncmp(interfacetype,"GDAT",4)==0) {
159                     main_gdat(x,device[x],lmapcnt,lmap);
160                 } else {
161                     gslog(LOG_ERR,"UNKNOWN InterfaceType\n");
162                     exit(0);
163                 }
164             }
165             
166             /* should never return */
167             gslog(LOG_EMERG,"lfta init returned");
168             exit(1);        
169         }
170     }
171     
172     /* initalize host_lib */
173     
174     gslog(LOG_INFO,"Init host lib in clearinghouse");
175     
176     if (hostlib_init(CLEARINGHOUSE,0,DEFAULTDEV,0,0)<0) {
177         gslog(LOG_EMERG,"%s::error:could not initiate host lib for clearinghouse\n",
178               argv[0]);
179         exit(7);
180     }
181     
182     
183     
184     /* start processing messages should never return*/
185     if (fta_start_service(-1)<0) {
186         gslog(LOG_EMERG,"error in processing the msg queue");
187         exit(9);
188     }
189     gslog(LOG_EMERG,"%s::error:start service returned");
190     return 0;
191 }
192