1 /*************************************************************/
2 /* NET_SEND.CXX by Oliver Delise */
4 /* e-mail: delise@mail.isis.de */
5 /* www: http://www.isis.de/members/odelise/progs/flightgear */
8 /* The author of this program offers no waranty at all */
9 /* about the correct execution of this software material. */
10 /* Furthermore, the author can NOT be held responsible for */
11 /* any physical or moral damage caused by the use of this */
14 /* This is an interactive standalone Tool to communicate */
15 /* with any FlightGear-Deamon. */
16 /* This is Open Source Software with many parts */
17 /* shamelessly stolen from others... */
19 /* -> This program will use a TCP port listening on a */
20 /* remote or local host inside the range you give to it. */
21 /* I offer no warranty over the accuracy though :) */
22 /* There are 3 verbose modes: No info, service info, and */
23 /* full info. No info is good of you only want the list */
24 /* of the ports, no more info. The best mode is Full */
25 /* info, as you get error information,etc. The main */
26 /* output is STDOUT, and ALL the errors go to STDERR. */
28 /* History: v0.1pre-alpha: May 25 1999 -> First release */
29 /* v0.1-alpha Nov 11 1999 */
30 /* v0.1-beta Jan 16 2000 -> libc5, glibc2.0 */
31 /* glibc-2.1 issues fixed */
32 /*************************************************************/
37 /* I prefer NHV's decl. */
38 #include <simgear/constants.h>
40 #include <Cockpit/hud.hxx>
42 #include <Main/views.hxx>
48 #include <arpa/inet.h>
51 struct sockaddr_in address;
52 struct sockaddr_in my_address;
54 extern const char *const sys_errlist[];
56 int current_port = 10000;
57 u_short base_port = 10000;
58 u_short end_port = 10010;
60 struct hostent *host_info, *f_host_info;
61 struct servent *service_info;
62 struct utsname myname;
66 int fgd_len_msg = 1, fgd_reply_len, fgd_status, fgd_ele_len, fgd_curpos, fgd_cnt, fgd_ppl,
67 fgd_ppl_old, fgd_loss, net_r;
69 char *fgd_job, *fgd_callsign, *fgd_name, *fgd_ip, *fgd_mcp_ip;
70 char *buffp, *src_host, *fgd_host, *fgfs_host, *fgfs_pilot, *fgd_txt;
72 extern sgMat4 sgFGD_VIEW;
73 extern ssgRoot *fgd_scene;
74 extern char *FGFS_host, *net_callsign;
82 /* unsigned */ char ipadr[16], callsign[16];
83 /* unsigned */ char lon[8], lat[8], alt[8], roll[8], pitch[8], yaw[8];
84 float lonf, latf, altf, speedf, rollf, pitchf, yawf;
87 ssgTransform *fgd_pos;
88 struct list_ele *next, *prev;
91 struct list_ele *head, *tail, *act, *test, *incoming, *boss, *other; /* fgd_msg; */
93 /*...Create head and tail of list */
94 void list_init( void) {
96 incoming = (struct list_ele*) malloc(sizeof(struct list_ele));
97 boss = (struct list_ele*) malloc(sizeof(struct list_ele));
98 other = (struct list_ele*) malloc(sizeof(struct list_ele));
99 head = (struct list_ele*) malloc(sizeof(struct list_ele));
100 tail = (struct list_ele*) malloc(sizeof(struct list_ele));
101 if (head == NULL || tail == NULL) { printf("Out of memory\n"); exit(1); }
103 tail->ipadr[0] = 255;
105 head->prev = tail->prev = head;
106 head->next = tail->next = tail;
107 act = head; /* put listpointer to beginning of list */
110 void list_output( void) {
113 void list_search( char name[16]) {
115 if (strcmp(name, head->next->ipadr) <= 0) act = head;
116 else if (strcmp(name, tail->prev->ipadr) > 0) act = tail->prev;
118 int vergleich = strcmp(name, act->ipadr);
120 while (strcmp(name, act->next->ipadr) > 0) {
123 else if (vergleich < 0)
124 while (strcmp(name, act->ipadr) < 0) {
128 while (strcmp(name, act->ipadr) == 0) {
134 void list_insert( char newip[16]) {
135 struct list_ele *new_ele;
137 new_ele = (struct list_ele*) malloc(sizeof(struct list_ele));
138 if (new_ele == NULL) { printf("Out of memory\n"); exit(1); }
139 strcpy(new_ele->ipadr, newip);
140 /* setting default */
141 strcpy(new_ele->callsign, "not assigned");
142 /* generating ssg stuff */
143 new_ele->fgd_sel = new ssgSelector;
144 new_ele->fgd_pos = new ssgTransform;
146 ssgEntity *fgd_obj = ssgLoadAC( "tuxcopter.ac" );
147 fgd_obj->clrTraversalMaskBits( SSGTRAV_HOT );
148 new_ele->fgd_pos->addKid( fgd_obj );
149 new_ele->fgd_sel->addKid( new_ele->fgd_pos );
150 ssgFlatten( fgd_obj );
151 ssgStripify( new_ele->fgd_sel );
153 fgd_scene->addKid( new_ele->fgd_sel );
154 fgd_scene->addKid( fgd_obj );
155 /* ssgKid "born" and inserted into scene */
158 new_ele->next = act->next;
159 act->next->prev = act->next = new_ele;
162 void list_setval( char newip[16]) {
165 strcpy( act->next->callsign, incoming->callsign);
166 printf("Callsign %s\n", act->next->callsign);
170 void list_clear( char clrip[16]) {
171 struct list_ele *clr_ele;
174 if ( strcmp( clrip, act->next->ipadr))
175 printf("....Name %s nicht vorhanden", clrip);
178 act->next = act->next->next;
179 act->next->prev = act;
184 int list_not_in( char name[16]) {
188 while ((test != tail) && (i==True)) {
189 i = (strcmp(test->ipadr, name) ? True : False);
191 if (verbose != 0) printf("list_not_in : %d\n",i);
196 void fgd_print_Mat4( sgMat4 m ) {
197 printf("0.0 %f 0.1 %f 0.2 %f 0.3 %f\n",
198 m[0][0], m[0][1], m[0][2], m[0][3] );
199 printf("1.0 %f 1.1 %f 1.2 %f 1.3 %f\n",
200 m[1][0], m[1][1], m[1][2], m[1][3] );
201 printf("2.0 %f 2.1 %f 2.2 %f 2.3 %f\n",
202 m[2][0], m[2][1], m[2][2], m[2][3] );
203 printf("3.0 %f 3.1 %f 3.2 %f 3.3 %f\n",
204 m[3][0], m[3][1], m[3][2], m[3][3] );
209 /* Let's init a few things */
210 printf("MCP: Allocating memory...");
211 buffp = (char *) malloc(1024); /* No I don't check if there are another KB */
212 fgd_job = (char *) malloc(8);
213 fgd_host = (char *) malloc(64);
214 fgd_callsign = (char *) malloc(64);
215 fgd_name = (char*) malloc(64);
216 fgd_ip = (char *) malloc(16);
217 fgd_mcp_ip = (char *) malloc(16);
218 fgfs_host = (char *) malloc(64);
219 fgfs_pilot = (char *) malloc(64);
220 src_host = (char *) malloc(64);
221 fgd_txt = (char *) malloc(1024);
222 printf("ok\nMCP: Initializing values...");
223 strcpy( fgd_job, "xxx");
224 strcpy( fgd_host, "Olk");
225 strcpy( fgd_callsign, "Unknown");
226 strcpy( fgd_name, "Unknown");
227 strcpy( fgd_ip, (char *) inet_ntoa(address.sin_addr));
228 strcpy( fgd_txt, "");
233 boss->speedf = 100.95;
236 boss->yawf = 456.789;
238 bzero((char *)&address, sizeof(address));
239 address.sin_family = AF_INET;
240 /* determinating the source/sending host */
241 if (uname(&myname) == 0) strcpy(src_host , myname.nodename);
242 printf("MCP: I'm running on HOST : %s ", src_host);
243 if (host_info = gethostbyname( src_host)) {
244 bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
245 strcpy((char *) fgd_mcp_ip, (char *) inet_ntoa(address.sin_addr));
247 printf("IP : %s\n", fgd_mcp_ip);
248 FGFS_host = src_host;
249 /* resolving the destination host, here fgd's host */
250 if (verbose == 2) printf(" Resolving default DEAMON: %s ->", fgd_host);
251 if (host_info = gethostbyname( fgd_host)) {
252 bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
253 strcpy((char *) fgd_ip, (char *) inet_ntoa(address.sin_addr));
255 printf(" resolved\n FGD running on HOST : %s", fgd_host);
256 printf(" IP : %s\n", fgd_ip);
258 } else if ((address.sin_addr.s_addr = inet_addr( fgd_host)) == INADDR_NONE) {
259 fprintf(stderr," Could not get %s host entry !\n", fgd_host);
260 printf(" NOT resolved !!!\n");
262 } else if (verbose == 2) printf(" address valid\n");
264 if ((base_port > end_port) || ((short)base_port < 0)) {
265 fprintf(stderr,"Bad port range : start=%d end=%d !\n");
267 } else if (verbose == 2) {
268 printf(" Port range: %d to %d\n",base_port,end_port);
272 int net_resolv_fgd( char *fgd_host_check ) {
276 /* resolving the destination host, here fgd's host */
278 if (verbose == 2) printf(" Resolving default DEAMON: %s ->", fgd_host_check);
279 if (host_info = gethostbyname( fgd_host_check)) {
280 bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
281 strcpy((char *) fgd_ip_check, (char *) inet_ntoa(address.sin_addr));
282 fgd_ip = fgd_ip_check;
284 printf(" FGD: resolved\nFGD: running on HOST : %s", fgd_host_check);
285 printf(" IP : %s\n", fgd_ip_check);
286 strcpy( fgd_host, fgd_host_check);
289 } else if ((address.sin_addr.s_addr = inet_addr( fgd_host)) == INADDR_NONE) {
290 fprintf(stderr,"FGD: Could not get %s host entry !\n", fgd_host_check);
291 printf(" FGD: NOT resolved !!!\n");
295 } else if (verbose == 2) printf(" address valid\n");
297 if ((base_port > end_port) || ((short)base_port < 0)) {
298 fprintf(stderr,"Bad port range : start=%d end=%d !\n");
302 } else if (verbose == 2) {
303 printf(" Port range: %d to %d\n",base_port,end_port);
308 void fgd_send_com( char *FGD_com, char *FGFS_host) {
311 // current_port = base_port;
312 if (verbose == 2) printf(" Sending : %s\n", FGD_com);
313 // while (current_port <= end_port) {
314 /* fprintf(stderr,"Trying port: %d\n",current_port); */
315 sock = socket(PF_INET, SOCK_STREAM, 0);
318 fprintf(stderr, "Error assigning master socket: %s\n",sys_errlist[errno]);
319 /* must check how severe this really is */
323 address.sin_port = htons(current_port);
324 if (verbose == 2) printf(" address.sin_port : %d\n",htons(address.sin_port));
326 f_host_info = gethostbyname(src_host);
328 //printf ("src_host : %s", ntohs(f_host_info->h_addr));
330 if (connect(sock, (struct sockaddr *)&address, sizeof(address)) == 0) {
331 /* FIXME: make a single string instead of sending elements */
333 fgd_len_msg = (int) sizeof(f_host_info->h_addr);
334 /* send length of sender-ip */
335 write( sock, &fgd_len_msg,1);
337 write( sock, f_host_info->h_addr, fgd_len_msg);
339 write( sock, FGD_com, 1);
340 /* send length of dummy-string, for the moment with _WHO_ to execute commando
341 here: his length of ip */
342 f_host_info = gethostbyname(FGFS_host);
343 fgd_len_msg = (int) sizeof(f_host_info->h_addr);
344 write( sock, &fgd_len_msg,1);
345 /* send dummy-string, for the moment with _WHO_ to execute commando
347 write( sock, f_host_info->h_addr, fgd_len_msg);
350 /* Here we send subsequent data... */
351 switch ( (char) FGD_com[0] - 0x30) {
352 case 5: fgd_len_msg = strlen( net_callsign);
353 write( sock, &fgd_len_msg,1);
354 /* send string, for the moment, here: callsign */
355 write( sock, net_callsign, fgd_len_msg);
356 /* Lon, Lat, Alt, Speed, Roll, Pitch, Yaw
357 hope this sprintf call is not too expensive */
358 sprintf( fgd_txt, " %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f",
359 // boss->latf, boss->lonf, boss->altf, boss->speedf,
360 // boss->rollf, boss->pitchf, boss->yawf);
362 Must decide if it's better to send values "as are" or convert them for
363 deamon, better is to let deamon make the job. Anyway this will depend on
364 speed loss/gain in network-area...
366 get_latitude(), get_longitude(), get_altitude(),
367 get_speed(), get_roll()*RAD_TO_DEG,
368 get_pitch()*RAD_TO_DEG, get_heading());
369 write( sock, fgd_txt, 56);
372 /* Here sending the previously calculated view.Mat4 by FGFS */
373 case 17: if (verbose == 2) printf("Checkpoint\n");
374 sgCopyMat4(sgFGD_COORD, current_view.VIEW);
377 printf("current_view\n");
378 fgd_print_Mat4( current_view.VIEW);
379 printf("FGD_COORD\n");
380 fgd_print_Mat4( sgFGD_COORD);
382 fgd_len_msg = strlen( net_callsign);
383 write( sock, &fgd_len_msg,1);
384 /* send string, for the moment, here: callsign */
385 write( sock, net_callsign, fgd_len_msg);
386 /* MATRIX-variant of Lon, Lat etc...
387 hope this sprintf call is not too expensive */
388 fgd_len_msg = sprintf( fgd_txt, " %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
389 sgFGD_COORD[0][0], sgFGD_COORD[0][1], sgFGD_COORD[0][2], sgFGD_COORD[0][3],
390 sgFGD_COORD[1][0], sgFGD_COORD[1][1], sgFGD_COORD[1][2], sgFGD_COORD[1][3],
391 sgFGD_COORD[2][0], sgFGD_COORD[2][1], sgFGD_COORD[2][2], sgFGD_COORD[2][3],
392 sgFGD_COORD[3][0], sgFGD_COORD[3][1], sgFGD_COORD[3][2], sgFGD_COORD[3][3]);
393 fgd_txt[fgd_len_msg] = 0;
394 write( sock, fgd_txt, fgd_len_msg+1);
400 /* be verbose, this goes later into own (*void) */
401 if (verbose == 2) printf(" Message : %s\n", FGD_com);
403 case 0: // printf("%d\n",current_port);
405 case 1: service_info = getservbyport(htons(current_port),"tcp");
407 printf("%d -> service name unknown\n",current_port);
409 printf("%d -> %s\n",current_port,service_info->s_name);
412 case 2: service_info = getservbyport(htons(current_port),"tcp");
414 printf(" Port %d found. Service name unknown\n",current_port);
416 printf(" Port %d found. Service name: %s\n",current_port,service_info->s_name);
420 } else if (errno == 113) {
421 fprintf(stderr,"No route to host !\n");
422 /* must check this */
425 /* fprintf(stderr,"Error %d connecting socket %d to port %d: %s\n",
426 errno,sock,current_port,sys_errlist[errno]); */
428 // service_info = getservbyport(htons(current_port),"tcp");
429 // if (!service_info) {
433 /* The Receiving Part, fgd returns errormessages, succes, etc... */
435 fgd_status = recv( sock, (char *) buffp, 5, MSG_WAITALL);
436 if (verbose == 2) printf(" status %d\n", fgd_status);
438 // while ( (fgd_status != 5) && (fgd_status != 0) );
439 while ( (fgd_status == -1) || (fgd_status == -1) );
440 fgd_reply_len = (unsigned char) buffp[3] + (unsigned char) buffp[4] * 256;
442 printf(" Got reply : %x %x %x MSG length %d Bytes\n",
443 buffp[0], buffp[1], buffp[2], fgd_reply_len);
445 if (strncmp( buffp, "FGD", 3) == 0) {
446 switch ( (char) FGD_com[0] - 0x30) {
448 abc = read( sock, fgd_name, fgd_reply_len);
449 if (verbose == 2) printf("readwert: %d", abc);
450 // fgd_name[buffp[3]] = 0;
451 printf("FGD: FlightGear-Deamon %s detected\n", fgd_name);
453 case 1: read( sock, fgd_txt, fgd_reply_len);
454 printf("FGD: Registering Host %s\n", fgd_txt);
456 case 2: printf("FGD: Showing registered Hosts at %s\n", fgd_host);
457 if ( fgd_reply_len != 5) {
458 /* FIXME: replace with SELECT to avoid broken pipes, known bug (-; */
460 fgd_status = recv( sock, fgd_txt, fgd_reply_len - 5,
462 // printf(" status %d\n", fgd_status);
464 // while ( (fgd_status != 5) && (fgd_status != 0) );
465 while ( (fgd_status == -1) || (fgd_status == -1) );
466 // read( sock, fgd_txt, fgd_reply_len - 5);
468 for (fgd_cnt = 1; fgd_cnt < (fgd_txt[0]+1); fgd_cnt++) {
469 fgd_ele_len = fgd_txt[fgd_curpos];
470 bcopy( &fgd_txt[fgd_curpos], fgfs_host, fgd_ele_len);
471 // fgfs_host[fgd_ele_len] = 0;
472 fgd_curpos += fgd_ele_len + 1;
473 if (verbose == 2) printf(" #%d %s\n", fgd_cnt, fgfs_host);
477 case 5: printf("FGD: Receiving data from Host %s\n", FGFS_host);
478 read( sock, fgd_txt, buffp[3]);
479 fgd_txt[buffp[3]] = 0;
481 if (strcmp(fgd_txt, "UNKNOWN") == 0) {
482 printf("FGD: Host not in list, sorry...\n");
484 else printf("FGD: Data from Host %s received\n", fgd_txt);
486 /* This has problem with glibc-2.1
487 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
488 if (verbose == 2) printf("FGD: Data from Host %s received\n", fgd_txt);
490 else if (verbose == 2) printf("FGD: Host not in list, sorry...\n");
493 case 17: if (verbose == 2) printf("FGD: Receiving Mat4 data from Host %s\n", FGFS_host);
494 read( sock, fgd_txt, fgd_reply_len);
495 // fgd_txt[buffp[3]] = 0;
496 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
497 if (verbose == 2) printf("FGD: Mat4 Data from Host %s received\n", fgd_txt);
499 else printf("FGD: Host not in list, sorry...\n");
501 case 6: printf("FGD: Sending data to Host %s\n", FGFS_host);
503 /* FIXME: replace with SELECT */
504 if (verbose == 2) printf("Noch %d bytes\n", (unsigned char) buffp[3]);
506 fgd_status = recv( sock, fgd_txt, (unsigned char) buffp[3]-4, MSG_PEEK);
507 if (verbose == 2) printf("Status %d\n", fgd_status);
509 while ( (fgd_status == 4) || (fgd_status == -1) );
510 // while ( (fgd_status == -1) || (fgd_status == -1) );
511 read( sock, fgd_txt, buffp[3]-4);
513 fgd_ppl_old = fgd_ppl;
514 fgd_ppl = fgd_txt[0];
515 /* Check if list has changed (pilot joined/left) */
516 if (fgd_ppl != fgd_ppl_old) {
517 printf(" List changed!!!\n");
518 for (fgd_cnt = 1; fgd_cnt <= abs(fgd_ppl - fgd_ppl_old); fgd_cnt++) {
519 if (verbose == 2) printf(" Checkpoint\n");
520 incoming = head->next;
521 if ((fgd_ppl - fgd_ppl_old) > 0) list_insert("test\0");
523 printf(" Clearing entry.\n");
524 list_clear(incoming->ipadr);
529 incoming = head->next;
530 for (fgd_cnt = 1; fgd_cnt < (fgd_ppl+1); fgd_cnt++) {
532 fgd_ele_len = fgd_txt[fgd_curpos-1];
533 bcopy( &fgd_txt[fgd_curpos], incoming->ipadr, fgd_ele_len);
534 incoming->ipadr[fgd_ele_len] = 0;
535 fgd_curpos = fgd_curpos + fgd_ele_len + 1;
537 fgd_ele_len = fgd_txt[fgd_curpos-1];
538 bcopy( &fgd_txt[fgd_curpos], incoming->callsign, fgd_ele_len);
539 incoming->callsign[fgd_ele_len] = 0;
540 fgd_curpos = fgd_curpos + fgd_ele_len + 1;
543 printf(" #%d %-16s %s\n", fgd_cnt, incoming->ipadr, incoming->callsign);
544 printf(" curpos:%d\n", fgd_curpos);
545 sscanf( &fgd_txt[fgd_curpos]," %7f %7f %7f %7f %7f %7f %7f",
546 &incoming->latf, &incoming->lonf,
547 &incoming->altf, &incoming->speedf, &incoming->rollf,
548 &incoming->pitchf, &incoming->yawf);
549 printf(" lat :%7.3f\n lon :%7.3f\n alt :%7.3f\n speed :%7.3f\n roll :%7.3f\n pitch :%7.3f\n yaw :%7.3f\n",
550 incoming->latf, incoming->lonf, incoming->altf, incoming->speedf,
551 incoming->rollf, incoming->pitchf, incoming->yawf);
554 incoming = incoming->next;
557 } /* end if "data available" */
558 /* Here reading the answer of completed command by fgd */
559 /* read( sock, fgd_txt, buffp[3]);
560 fgd_txt[buffp[3]] = 0;
561 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
562 if (verbose == 2) printf("FGD: Data to Host sent\n");
564 else printf("FGD: Host not in list, sorry...\n");
567 case 18: if (verbose == 2) printf("FGD: Sending Mat4 data to Host %s\n", FGFS_host);
568 if (fgd_reply_len != 5) {
569 /* FIXME: replace with SELECT */
570 if (verbose == 2) printf("Noch %d bytes\n", fgd_reply_len);
572 fgd_status = recv( sock, fgd_txt, fgd_reply_len - 5, MSG_WAITALL);
573 if (verbose == 2) printf("Status %d\n", fgd_status);
575 // while ( (fgd_status == 4) || (fgd_status == -1) );
576 while ( (fgd_status == -1) || (fgd_status == -1) );
577 // read( sock, fgd_txt, fgd_reply_len - 5);
579 fgd_ppl_old = fgd_ppl;
580 fgd_ppl = fgd_txt[0];
581 /* Check if list has changed (pilot joined/left) */
582 if (fgd_ppl != fgd_ppl_old) {
583 printf(" List changed!!!\n");
584 for (fgd_cnt = 1; fgd_cnt <= abs(fgd_ppl - fgd_ppl_old); fgd_cnt++) {
585 if (verbose == 2) printf(" Checkpoint\n");
586 incoming = head->next;
587 if ((fgd_ppl - fgd_ppl_old) > 0) list_insert("test\0");
589 printf(" Clearing entry.\n");
590 list_clear(incoming->ipadr);
595 incoming = head->next;
596 for (fgd_cnt = 1; fgd_cnt < (fgd_ppl+1); fgd_cnt++) {
598 fgd_ele_len = fgd_txt[fgd_curpos-1];
599 bcopy( &fgd_txt[fgd_curpos], incoming->ipadr, fgd_ele_len);
600 incoming->ipadr[fgd_ele_len] = 0;
601 fgd_curpos = fgd_curpos + fgd_ele_len + 1;
603 fgd_ele_len = fgd_txt[fgd_curpos-1];
604 bcopy( &fgd_txt[fgd_curpos], incoming->callsign, fgd_ele_len);
605 incoming->callsign[fgd_ele_len] = 0;
606 fgd_curpos = fgd_curpos + fgd_ele_len + 1;
609 printf(" #%d %-16s %s\n", fgd_cnt, incoming->ipadr, incoming->callsign);
610 printf(" curpos:%d\n", fgd_curpos);
612 fgd_len_msg = strlen ( &fgd_txt[fgd_curpos]);
613 sscanf( &fgd_txt[fgd_curpos]," %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
614 &incoming->sgFGD_COORD[0][0], &incoming->sgFGD_COORD[0][1], &incoming->sgFGD_COORD[0][2], &incoming->sgFGD_COORD[0][3],
615 &incoming->sgFGD_COORD[1][0], &incoming->sgFGD_COORD[1][1], &incoming->sgFGD_COORD[1][2], &incoming->sgFGD_COORD[1][3],
616 &incoming->sgFGD_COORD[2][0], &incoming->sgFGD_COORD[2][1], &incoming->sgFGD_COORD[2][2], &incoming->sgFGD_COORD[2][3],
617 &incoming->sgFGD_COORD[3][0], &incoming->sgFGD_COORD[3][1], &incoming->sgFGD_COORD[3][2], &incoming->sgFGD_COORD[3][3]);
620 printf("Incoming Mat4\n");
621 fgd_print_Mat4( incoming->sgFGD_COORD );
623 fgd_curpos += fgd_len_msg + 2;
624 incoming = incoming->next;
627 } /* end if "data available" */
628 /* The first view-Mat4 is somebody else */
629 sgCopyMat4(sgFGD_VIEW, head->next->sgFGD_COORD);
631 /* Here reading the answer of completed command by fgd */
632 /* read( sock, fgd_txt, buffp[3]);
633 // fgd_txt[buffp[3]] = 0;
634 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
635 if (verbose == 2) printf("FGD: Mat4 Data to Host sent\n");
637 else printf("FGD: Host not in list, sorry...\n");
640 case 8: printf("FGD: Unregistering Host %s\n", FGFS_host);
641 read( sock, fgd_txt, buffp[3]);
642 fgd_txt[buffp[3]] = 0;
644 while (test != tail) {
645 list_clear( test->ipadr );
650 if (strcmp(fgd_txt, "UNKNOWN") == 0) {
651 printf("FGD: Host not in list, sorry...\n");
653 else printf("FGD: Host %s unregistered\n", fgd_txt);
655 /* This does not work on glibc-2.1
656 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
657 printf("FGD: Host %s unregistered\n", fgd_txt);
659 else printf("FGD: Host not in list, sorry...\n");
662 case 9: printf(" Shutdown FlightGear-Deamon %s .\n", fgd_name);
666 } else printf(" Huh?: no deamon present, yuk!!!\n");
672 if (verbose == 2) printf("fgd_com completed.\n");