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>
47 #include <arpa/inet.h>
50 struct sockaddr_in address;
51 struct sockaddr_in my_address;
54 #if defined( __CYGWIN__ )
56 const char *const *sys_errlist = _sys_errlist;
58 extern const char *const sys_errlist[];
62 int current_port = 10000;
63 u_short base_port = 10000;
64 u_short end_port = 10010;
66 struct hostent *host_info, *f_host_info;
67 struct servent *service_info;
68 struct utsname myname;
72 int fgd_len_msg = 1, fgd_reply_len, fgd_status, fgd_ele_len, fgd_curpos, fgd_cnt, fgd_ppl,
73 fgd_ppl_old, fgd_loss, net_r;
75 char *fgd_job, *fgd_callsign, *fgd_name, *fgd_ip, *fgd_mcp_ip;
76 char *buffp, *src_host, *fgd_host, *fgfs_host, *fgfs_pilot, *fgd_txt;
78 extern sgMat4 sgFGD_VIEW;
79 extern ssgRoot *fgd_scene;
80 extern char *FGFS_host, *net_callsign;
88 /* unsigned */ char ipadr[16], callsign[16];
89 /* unsigned */ char lon[8], lat[8], alt[8], roll[8], pitch[8], yaw[8];
90 float lonf, latf, altf, speedf, rollf, pitchf, yawf;
93 ssgTransform *fgd_pos;
94 struct list_ele *next, *prev;
97 struct list_ele *head, *tail, *act, *test, *incoming, *boss, *other; /* fgd_msg; */
99 /*...Create head and tail of list */
100 void list_init( void) {
102 incoming = (struct list_ele*) malloc(sizeof(struct list_ele));
103 boss = (struct list_ele*) malloc(sizeof(struct list_ele));
104 other = (struct list_ele*) malloc(sizeof(struct list_ele));
105 head = (struct list_ele*) malloc(sizeof(struct list_ele));
106 tail = (struct list_ele*) malloc(sizeof(struct list_ele));
107 if (head == NULL || tail == NULL) { printf("Out of memory\n"); exit(1); }
109 tail->ipadr[0] = 255;
111 head->prev = tail->prev = head;
112 head->next = tail->next = tail;
113 act = head; /* put listpointer to beginning of list */
116 void list_output( void) {
119 void list_search( char name[16]) {
121 if (strcmp(name, head->next->ipadr) <= 0) act = head;
122 else if (strcmp(name, tail->prev->ipadr) > 0) act = tail->prev;
124 int vergleich = strcmp(name, act->ipadr);
126 while (strcmp(name, act->next->ipadr) > 0) {
129 else if (vergleich < 0)
130 while (strcmp(name, act->ipadr) < 0) {
134 while (strcmp(name, act->ipadr) == 0) {
140 void list_insert( char newip[16]) {
141 struct list_ele *new_ele;
143 new_ele = (struct list_ele*) malloc(sizeof(struct list_ele));
144 if (new_ele == NULL) { printf("Out of memory\n"); exit(1); }
145 strcpy(new_ele->ipadr, newip);
146 /* setting default */
147 strcpy(new_ele->callsign, "not assigned");
148 /* generating ssg stuff */
149 new_ele->fgd_sel = new ssgSelector;
150 new_ele->fgd_pos = new ssgTransform;
152 ssgEntity *fgd_obj = ssgLoadAC( "tuxcopter.ac" );
153 fgd_obj->clrTraversalMaskBits( SSGTRAV_HOT );
154 new_ele->fgd_pos->addKid( fgd_obj );
155 new_ele->fgd_sel->addKid( new_ele->fgd_pos );
156 ssgFlatten( fgd_obj );
157 ssgStripify( new_ele->fgd_sel );
159 fgd_scene->addKid( new_ele->fgd_sel );
160 fgd_scene->addKid( fgd_obj );
161 /* ssgKid "born" and inserted into scene */
164 new_ele->next = act->next;
165 act->next->prev = act->next = new_ele;
168 void list_setval( char newip[16]) {
171 strcpy( act->next->callsign, incoming->callsign);
172 printf("Callsign %s\n", act->next->callsign);
176 void list_clear( char clrip[16]) {
177 struct list_ele *clr_ele;
180 if ( strcmp( clrip, act->next->ipadr))
181 printf("....Name %s nicht vorhanden", clrip);
184 act->next = act->next->next;
185 act->next->prev = act;
190 int list_not_in( char name[16]) {
194 while ((test != tail) && (i==True)) {
195 i = (strcmp(test->ipadr, name) ? True : False);
197 if (verbose != 0) printf("list_not_in : %d\n",i);
202 void fgd_print_Mat4( sgMat4 m ) {
203 printf("0.0 %f 0.1 %f 0.2 %f 0.3 %f\n",
204 m[0][0], m[0][1], m[0][2], m[0][3] );
205 printf("1.0 %f 1.1 %f 1.2 %f 1.3 %f\n",
206 m[1][0], m[1][1], m[1][2], m[1][3] );
207 printf("2.0 %f 2.1 %f 2.2 %f 2.3 %f\n",
208 m[2][0], m[2][1], m[2][2], m[2][3] );
209 printf("3.0 %f 3.1 %f 3.2 %f 3.3 %f\n",
210 m[3][0], m[3][1], m[3][2], m[3][3] );
215 /* Let's init a few things */
216 printf("MCP: Allocating memory...");
217 buffp = (char *) malloc(1024); /* No I don't check if there are another KB */
218 fgd_job = (char *) malloc(8);
219 fgd_host = (char *) malloc(64);
220 fgd_callsign = (char *) malloc(64);
221 fgd_name = (char*) malloc(64);
222 fgd_ip = (char *) malloc(16);
223 fgd_mcp_ip = (char *) malloc(16);
224 fgfs_host = (char *) malloc(64);
225 fgfs_pilot = (char *) malloc(64);
226 src_host = (char *) malloc(64);
227 fgd_txt = (char *) malloc(1024);
228 printf("ok\nMCP: Initializing values...");
229 strcpy( fgd_job, "xxx");
230 strcpy( fgd_host, "Olk");
231 strcpy( fgd_callsign, "Unknown");
232 strcpy( fgd_name, "Unknown");
233 strcpy( fgd_ip, (char *) inet_ntoa(address.sin_addr));
234 strcpy( fgd_txt, "");
239 boss->speedf = 100.95;
242 boss->yawf = 456.789;
244 bzero((char *)&address, sizeof(address));
245 address.sin_family = AF_INET;
246 /* determinating the source/sending host */
247 if (uname(&myname) == 0) strcpy(src_host , myname.nodename);
248 printf("MCP: I'm running on HOST : %s ", src_host);
249 if (host_info = gethostbyname( src_host)) {
250 bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
251 strcpy((char *) fgd_mcp_ip, (char *) inet_ntoa(address.sin_addr));
253 printf("IP : %s\n", fgd_mcp_ip);
254 FGFS_host = src_host;
255 /* resolving the destination host, here fgd's host */
256 if (verbose == 2) printf(" Resolving default DEAMON: %s ->", fgd_host);
257 if (host_info = gethostbyname( fgd_host)) {
258 bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
259 strcpy((char *) fgd_ip, (char *) inet_ntoa(address.sin_addr));
261 printf(" resolved\n FGD running on HOST : %s", fgd_host);
262 printf(" IP : %s\n", fgd_ip);
264 } else if ((address.sin_addr.s_addr = inet_addr( fgd_host)) == INADDR_NONE) {
265 fprintf(stderr," Could not get %s host entry !\n", fgd_host);
266 printf(" NOT resolved !!!\n");
268 } else if (verbose == 2) printf(" address valid\n");
270 if ((base_port > end_port) || ((short)base_port < 0)) {
271 fprintf(stderr,"Bad port range : start=%d end=%d !\n",base_port,end_port);
273 } else if (verbose == 2) {
274 printf(" Port range: %d to %d\n",base_port,end_port);
278 int net_resolv_fgd( char *fgd_host_check ) {
282 /* resolving the destination host, here fgd's host */
284 if (verbose == 2) printf(" Resolving default DEAMON: %s ->", fgd_host_check);
285 if (host_info = gethostbyname( fgd_host_check)) {
286 bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
287 strcpy((char *) fgd_ip_check, (char *) inet_ntoa(address.sin_addr));
288 fgd_ip = fgd_ip_check;
290 printf(" FGD: resolved\nFGD: running on HOST : %s", fgd_host_check);
291 printf(" IP : %s\n", fgd_ip_check);
292 strcpy( fgd_host, fgd_host_check);
295 } else if ((address.sin_addr.s_addr = inet_addr( fgd_host)) == INADDR_NONE) {
296 fprintf(stderr,"FGD: Could not get %s host entry !\n", fgd_host_check);
297 printf(" FGD: NOT resolved !!!\n");
301 } else if (verbose == 2) printf(" address valid\n");
303 if ((base_port > end_port) || ((short)base_port < 0)) {
304 fprintf(stderr,"Bad port range : start=%d end=%d !\n",base_port,end_port);
308 } else if (verbose == 2) {
309 printf(" Port range: %d to %d\n",base_port,end_port);
315 void fgd_send_com( char *FGD_com, char *FGFS_host) {
318 // current_port = base_port;
319 if (verbose == 2) printf(" Sending : %s\n", FGD_com);
320 // while (current_port <= end_port) {
321 /* fprintf(stderr,"Trying port: %d\n",current_port); */
322 sock = socket(PF_INET, SOCK_STREAM, 0);
325 fprintf(stderr, "Error assigning master socket: %s\n",sys_errlist[errno]);
326 /* must check how severe this really is */
330 address.sin_port = htons(current_port);
331 if (verbose == 2) printf(" address.sin_port : %d\n",htons(address.sin_port));
333 f_host_info = gethostbyname(src_host);
335 //printf ("src_host : %s", ntohs(f_host_info->h_addr));
337 if (connect(sock, (struct sockaddr *)&address, sizeof(address)) == 0) {
338 /* FIXME: make a single string instead of sending elements */
340 fgd_len_msg = (int) sizeof(f_host_info->h_addr);
341 /* send length of sender-ip */
342 write( sock, &fgd_len_msg,1);
344 write( sock, f_host_info->h_addr, fgd_len_msg);
346 write( sock, FGD_com, 1);
347 /* send length of dummy-string, for the moment with _WHO_ to execute commando
348 here: his length of ip */
349 f_host_info = gethostbyname(FGFS_host);
350 fgd_len_msg = (int) sizeof(f_host_info->h_addr);
351 write( sock, &fgd_len_msg,1);
352 /* send dummy-string, for the moment with _WHO_ to execute commando
354 write( sock, f_host_info->h_addr, fgd_len_msg);
357 /* Here we send subsequent data... */
358 switch ( (char) FGD_com[0] - 0x30) {
359 case 5: fgd_len_msg = strlen( net_callsign);
360 write( sock, &fgd_len_msg,1);
361 /* send string, for the moment, here: callsign */
362 write( sock, net_callsign, fgd_len_msg);
363 /* Lon, Lat, Alt, Speed, Roll, Pitch, Yaw
364 hope this sprintf call is not too expensive */
365 sprintf( fgd_txt, " %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f",
366 // boss->latf, boss->lonf, boss->altf, boss->speedf,
367 // boss->rollf, boss->pitchf, boss->yawf);
369 Must decide if it's better to send values "as are" or convert them for
370 deamon, better is to let deamon make the job. Anyway this will depend on
371 speed loss/gain in network-area...
373 get_latitude(), get_longitude(), get_altitude(),
374 get_speed(), get_roll()*RAD_TO_DEG,
375 get_pitch()*RAD_TO_DEG, get_heading());
376 write( sock, fgd_txt, 56);
379 /* Here sending the previously calculated view.Mat4 by FGFS */
380 case 17: if (verbose == 2) printf("Checkpoint\n");
381 sgCopyMat4(sgFGD_COORD, current_view.VIEW);
384 printf("current_view\n");
385 fgd_print_Mat4( current_view.VIEW);
386 printf("FGD_COORD\n");
387 fgd_print_Mat4( sgFGD_COORD);
389 fgd_len_msg = strlen( net_callsign);
390 write( sock, &fgd_len_msg,1);
391 /* send string, for the moment, here: callsign */
392 write( sock, net_callsign, fgd_len_msg);
393 /* MATRIX-variant of Lon, Lat etc...
394 hope this sprintf call is not too expensive */
395 fgd_len_msg = sprintf( fgd_txt, " %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
396 sgFGD_COORD[0][0], sgFGD_COORD[0][1], sgFGD_COORD[0][2], sgFGD_COORD[0][3],
397 sgFGD_COORD[1][0], sgFGD_COORD[1][1], sgFGD_COORD[1][2], sgFGD_COORD[1][3],
398 sgFGD_COORD[2][0], sgFGD_COORD[2][1], sgFGD_COORD[2][2], sgFGD_COORD[2][3],
399 sgFGD_COORD[3][0], sgFGD_COORD[3][1], sgFGD_COORD[3][2], sgFGD_COORD[3][3]);
400 fgd_txt[fgd_len_msg] = 0;
401 write( sock, fgd_txt, fgd_len_msg+1);
407 /* be verbose, this goes later into own (*void) */
408 if (verbose == 2) printf(" Message : %s\n", FGD_com);
410 case 0: // printf("%d\n",current_port);
412 case 1: service_info = getservbyport(htons(current_port),"tcp");
414 printf("%d -> service name unknown\n",current_port);
416 printf("%d -> %s\n",current_port,service_info->s_name);
419 case 2: service_info = getservbyport(htons(current_port),"tcp");
421 printf(" Port %d found. Service name unknown\n",current_port);
423 printf(" Port %d found. Service name: %s\n",current_port,service_info->s_name);
427 } else if (errno == 113) {
428 fprintf(stderr,"No route to host !\n");
429 /* must check this */
432 /* fprintf(stderr,"Error %d connecting socket %d to port %d: %s\n",
433 errno,sock,current_port,sys_errlist[errno]); */
435 // service_info = getservbyport(htons(current_port),"tcp");
436 // if (!service_info) {
440 /* The Receiving Part, fgd returns errormessages, succes, etc... */
442 fgd_status = recv( sock, (char *) buffp, 5, MSG_WAITALL);
443 if (verbose == 2) printf(" status %d\n", fgd_status);
445 // while ( (fgd_status != 5) && (fgd_status != 0) );
446 while ( (fgd_status == -1) || (fgd_status == -1) );
447 fgd_reply_len = (unsigned char) buffp[3] + (unsigned char) buffp[4] * 256;
449 printf(" Got reply : %x %x %x MSG length %d Bytes\n",
450 buffp[0], buffp[1], buffp[2], fgd_reply_len);
452 if (strncmp( buffp, "FGD", 3) == 0) {
453 switch ( (char) FGD_com[0] - 0x30) {
455 abc = read( sock, fgd_name, fgd_reply_len);
456 if (verbose == 2) printf("readwert: %d", abc);
457 // fgd_name[buffp[3]] = 0;
458 printf("FGD: FlightGear-Deamon %s detected\n", fgd_name);
460 case 1: read( sock, fgd_txt, fgd_reply_len);
461 printf("FGD: Registering Host %s\n", fgd_txt);
463 case 2: printf("FGD: Showing registered Hosts at %s\n", fgd_host);
464 if ( fgd_reply_len != 5) {
465 /* FIXME: replace with SELECT to avoid broken pipes, known bug (-; */
467 fgd_status = recv( sock, fgd_txt, fgd_reply_len - 5,
469 // printf(" status %d\n", fgd_status);
471 // while ( (fgd_status != 5) && (fgd_status != 0) );
472 while ( (fgd_status == -1) || (fgd_status == -1) );
473 // read( sock, fgd_txt, fgd_reply_len - 5);
475 for (fgd_cnt = 1; fgd_cnt < (fgd_txt[0]+1); fgd_cnt++) {
476 fgd_ele_len = fgd_txt[fgd_curpos];
477 bcopy( &fgd_txt[fgd_curpos], fgfs_host, fgd_ele_len);
478 // fgfs_host[fgd_ele_len] = 0;
479 fgd_curpos += fgd_ele_len + 1;
480 if (verbose == 2) printf(" #%d %s\n", fgd_cnt, fgfs_host);
484 case 5: printf("FGD: Receiving data from Host %s\n", FGFS_host);
485 read( sock, fgd_txt, buffp[3]);
486 fgd_txt[buffp[3]] = 0;
488 if (strcmp(fgd_txt, "UNKNOWN") == 0) {
489 printf("FGD: Host not in list, sorry...\n");
491 else printf("FGD: Data from Host %s received\n", fgd_txt);
493 /* This has problem with glibc-2.1
494 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
495 if (verbose == 2) printf("FGD: Data from Host %s received\n", fgd_txt);
497 else if (verbose == 2) printf("FGD: Host not in list, sorry...\n");
500 case 17: if (verbose == 2) printf("FGD: Receiving Mat4 data from Host %s\n", FGFS_host);
501 read( sock, fgd_txt, fgd_reply_len);
502 // fgd_txt[buffp[3]] = 0;
503 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
504 if (verbose == 2) printf("FGD: Mat4 Data from Host %s received\n", fgd_txt);
506 else printf("FGD: Host not in list, sorry...\n");
508 case 6: printf("FGD: Sending data to Host %s\n", FGFS_host);
510 /* FIXME: replace with SELECT */
511 if (verbose == 2) printf("Noch %d bytes\n", (unsigned char) buffp[3]);
513 fgd_status = recv( sock, fgd_txt, (unsigned char) buffp[3]-4, MSG_PEEK);
514 if (verbose == 2) printf("Status %d\n", fgd_status);
516 while ( (fgd_status == 4) || (fgd_status == -1) );
517 // while ( (fgd_status == -1) || (fgd_status == -1) );
518 read( sock, fgd_txt, buffp[3]-4);
520 fgd_ppl_old = fgd_ppl;
521 fgd_ppl = fgd_txt[0];
522 /* Check if list has changed (pilot joined/left) */
523 if (fgd_ppl != fgd_ppl_old) {
524 printf(" List changed!!!\n");
525 for (fgd_cnt = 1; fgd_cnt <= abs(fgd_ppl - fgd_ppl_old); fgd_cnt++) {
526 if (verbose == 2) printf(" Checkpoint\n");
527 incoming = head->next;
528 if ((fgd_ppl - fgd_ppl_old) > 0) list_insert("test\0");
530 printf(" Clearing entry.\n");
531 list_clear(incoming->ipadr);
536 incoming = head->next;
537 for (fgd_cnt = 1; fgd_cnt < (fgd_ppl+1); fgd_cnt++) {
539 fgd_ele_len = fgd_txt[fgd_curpos-1];
540 bcopy( &fgd_txt[fgd_curpos], incoming->ipadr, fgd_ele_len);
541 incoming->ipadr[fgd_ele_len] = 0;
542 fgd_curpos = fgd_curpos + fgd_ele_len + 1;
544 fgd_ele_len = fgd_txt[fgd_curpos-1];
545 bcopy( &fgd_txt[fgd_curpos], incoming->callsign, fgd_ele_len);
546 incoming->callsign[fgd_ele_len] = 0;
547 fgd_curpos = fgd_curpos + fgd_ele_len + 1;
550 printf(" #%d %-16s %s\n", fgd_cnt, incoming->ipadr, incoming->callsign);
551 printf(" curpos:%d\n", fgd_curpos);
552 sscanf( &fgd_txt[fgd_curpos]," %7f %7f %7f %7f %7f %7f %7f",
553 &incoming->latf, &incoming->lonf,
554 &incoming->altf, &incoming->speedf, &incoming->rollf,
555 &incoming->pitchf, &incoming->yawf);
556 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",
557 incoming->latf, incoming->lonf, incoming->altf, incoming->speedf,
558 incoming->rollf, incoming->pitchf, incoming->yawf);
561 incoming = incoming->next;
564 } /* end if "data available" */
565 /* Here reading the answer of completed command by fgd */
566 /* read( sock, fgd_txt, buffp[3]);
567 fgd_txt[buffp[3]] = 0;
568 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
569 if (verbose == 2) printf("FGD: Data to Host sent\n");
571 else printf("FGD: Host not in list, sorry...\n");
574 case 18: if (verbose == 2) printf("FGD: Sending Mat4 data to Host %s\n", FGFS_host);
575 if (fgd_reply_len != 5) {
576 /* FIXME: replace with SELECT */
577 if (verbose == 2) printf("Noch %d bytes\n", fgd_reply_len);
579 fgd_status = recv( sock, fgd_txt, fgd_reply_len - 5, MSG_WAITALL);
580 if (verbose == 2) printf("Status %d\n", fgd_status);
582 // while ( (fgd_status == 4) || (fgd_status == -1) );
583 while ( (fgd_status == -1) || (fgd_status == -1) );
584 // read( sock, fgd_txt, fgd_reply_len - 5);
586 fgd_ppl_old = fgd_ppl;
587 fgd_ppl = fgd_txt[0];
588 /* Check if list has changed (pilot joined/left) */
589 if (fgd_ppl != fgd_ppl_old) {
590 printf(" List changed!!!\n");
591 for (fgd_cnt = 1; fgd_cnt <= abs(fgd_ppl - fgd_ppl_old); fgd_cnt++) {
592 if (verbose == 2) printf(" Checkpoint\n");
593 incoming = head->next;
594 if ((fgd_ppl - fgd_ppl_old) > 0) list_insert("test\0");
596 printf(" Clearing entry.\n");
597 list_clear(incoming->ipadr);
602 incoming = head->next;
603 for (fgd_cnt = 1; fgd_cnt < (fgd_ppl+1); fgd_cnt++) {
605 fgd_ele_len = fgd_txt[fgd_curpos-1];
606 bcopy( &fgd_txt[fgd_curpos], incoming->ipadr, fgd_ele_len);
607 incoming->ipadr[fgd_ele_len] = 0;
608 fgd_curpos = fgd_curpos + fgd_ele_len + 1;
610 fgd_ele_len = fgd_txt[fgd_curpos-1];
611 bcopy( &fgd_txt[fgd_curpos], incoming->callsign, fgd_ele_len);
612 incoming->callsign[fgd_ele_len] = 0;
613 fgd_curpos = fgd_curpos + fgd_ele_len + 1;
616 printf(" #%d %-16s %s\n", fgd_cnt, incoming->ipadr, incoming->callsign);
617 printf(" curpos:%d\n", fgd_curpos);
619 fgd_len_msg = strlen ( &fgd_txt[fgd_curpos]);
620 sscanf( &fgd_txt[fgd_curpos]," %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
621 &incoming->sgFGD_COORD[0][0], &incoming->sgFGD_COORD[0][1], &incoming->sgFGD_COORD[0][2], &incoming->sgFGD_COORD[0][3],
622 &incoming->sgFGD_COORD[1][0], &incoming->sgFGD_COORD[1][1], &incoming->sgFGD_COORD[1][2], &incoming->sgFGD_COORD[1][3],
623 &incoming->sgFGD_COORD[2][0], &incoming->sgFGD_COORD[2][1], &incoming->sgFGD_COORD[2][2], &incoming->sgFGD_COORD[2][3],
624 &incoming->sgFGD_COORD[3][0], &incoming->sgFGD_COORD[3][1], &incoming->sgFGD_COORD[3][2], &incoming->sgFGD_COORD[3][3]);
627 printf("Incoming Mat4\n");
628 fgd_print_Mat4( incoming->sgFGD_COORD );
630 fgd_curpos += fgd_len_msg + 2;
631 incoming = incoming->next;
634 } /* end if "data available" */
635 /* The first view-Mat4 is somebody else */
636 sgCopyMat4(sgFGD_VIEW, head->next->sgFGD_COORD);
638 /* Here reading the answer of completed command by fgd */
639 /* read( sock, fgd_txt, buffp[3]);
640 // fgd_txt[buffp[3]] = 0;
641 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
642 if (verbose == 2) printf("FGD: Mat4 Data to Host sent\n");
644 else printf("FGD: Host not in list, sorry...\n");
647 case 8: printf("FGD: Unregistering Host %s\n", FGFS_host);
648 read( sock, fgd_txt, buffp[3]);
649 fgd_txt[buffp[3]] = 0;
651 while (test != tail) {
652 list_clear( test->ipadr );
657 if (strcmp(fgd_txt, "UNKNOWN") == 0) {
658 printf("FGD: Host not in list, sorry...\n");
660 else printf("FGD: Host %s unregistered\n", fgd_txt);
662 /* This does not work on glibc-2.1
663 if (strcmp(fgd_txt, "UNKNOWN") == -1) {
664 printf("FGD: Host %s unregistered\n", fgd_txt);
666 else printf("FGD: Host not in list, sorry...\n");
669 case 9: printf(" Shutdown FlightGear-Deamon %s .\n", fgd_name);
673 } else printf(" Huh?: no deamon present, yuk!!!\n");
679 if (verbose == 2) printf("fgd_com completed.\n");