]> git.mxchange.org Git - flightgear.git/blobdiff - src/NetworkOLK/Tools/fgd.c
Added write-all parameter to save command. If set to true, the
[flightgear.git] / src / NetworkOLK / Tools / fgd.c
index dc875ddffc719ae5f750a46ea78beedb54b88e78..07a5931a2d9cc6eb26993605675cce56b24538aa 100644 (file)
@@ -1,33 +1,36 @@
-/***********************************************************/
-/* FGD.C by Oliver Delise                                  */
-/* Contact info:                                           */
-/* e-mail: delise@rp-plus.de                               */
-/* www: http://www.online-club.de/~olk/progs/mmx-emu/      */
-/* ftp: http://www.online-club.de/~olk/progs/flightgear    */ 
-/*                                                         */
-/* Version 0.1pre-alpha                                    */
-/* The author of this program offers no waranty at all     */
-/* about the correct execution of this software material.  */
-/* Furthermore, the author can NOT be held responsible for */
-/* any physical or moral damage caused by the use of this  */
-/* software.                                               */
-/*                                                         */
-/* This is a standalone Tool to communicate with any       */
-/* FlightGear System and FGFS-Deamon.                      */
-/* This is Open Source Software with many parts            */
-/* shamelessly stolen from others...                       */
-/*                                                         */
-/* -> This program will scan for TCP port listening on a   */
-/*    remote or local host inside the range you give to it.*/
-/*    I offer no warranty over the accuracy though :)      */
-/*    There are 3 verbose modes: No info, service info, and*/
-/*    full info. No info is good of you only want the list */
-/*    of the ports, no more info. The best mode is Full    */
-/*    info, as you get error information,etc. The main     */
-/*    output is STDOUT, and ALL the errors go to STDERR.   */
-/*                                                         */
-/*    History: v0.1pre-alpha: May 25 1999 -> First release */
-/***********************************************************/
+/*************************************************************/
+/* FGD.C by Oliver Delise                                    */
+/* Contact info:                                             */
+/* e-mail: delise@mail.isis.de                               */
+/* www: http://www.isis.de/members/~odelise/progs/flightgear  */
+/*                                                           */
+/* Version 0.1-beta                                          */
+/* The author of this program offers no waranty at all       */
+/* about the correct execution of this software material.    */
+/* Furthermore, the author can NOT be held responsible for   */
+/* any physical or moral damage caused by the use of this    */
+/* software.                                                 */
+/*                                                           */
+/* This is a standalone Tool to communicate with any         */
+/* FlightGear System and FGFS-Deamon.                        */
+/* This is Open Source Software with some parts              */
+/* shamelessly stolen from others...                         */
+/*                                                           */
+/* -> This program will use a TCP port listening on a        */
+/*    remote or local host inside the range you give to it.  */
+/*    I offer no warranty over the accuracy though :)        */
+/*    There are 3 verbose modes: No info, service info, and  */
+/*    full info. No info is good of you only want the list   */
+/*    of the ports, no more info. The best mode is Full      */
+/*    info, as you get error information,etc. The main       */
+/*    output is STDOUT, and ALL the errors go to STDERR.     */
+/*                                                           */
+/*    History: v0.1pre-alpha: May 25 1999 -> First release   */
+/*             v0.1-alpha   : Nov 08 1999                    */
+/*             v0.1-beta    : Jan 16 2000                    */
+/*                            libc5, glibc-2.0, 2.1 cleanups */
+/*                            June 8 2000    socket cleanup  */
+/*************************************************************/
 
 
 #include <stdio.h>
@@ -40,6 +43,7 @@
 #include <fcntl.h>
 #include <sys/utsname.h>
 
+//#define printf //
 
 /* Net-stuff */
 fd_set rset, allset;
@@ -48,31 +52,48 @@ struct timeval tv;
 struct utsname myname;
 char *fgd_host, *src_host;
 
+/* Program-stuff */
+int verbose, fgd_len_msg;
+
 /* List-stuff (doubly-Linked-list) */
 #include <string.h>
 #include <stdlib.h>
 
-int i,j;
-char *vb;
+int i, j, fgd_cnt, fgd_curpos;
+char *vb, *fgd_txt;
 const int True  = 0;
 const int False= -1;
 
+float sgFGD_COORD[4][4];
+
 struct list_ele {
-   unsigned char ipadr[16], squak[16];
-   float *lon, *lat, *alt, *roll, *pitch, *yaw;
+   unsigned char ipadr[16], callsign[16];
+   unsigned char lat[8], lon[8], alt[8], speed[8], roll[8], pitch[8], yaw[8];
+   float latf, lonf, altf, speedf, rollf, pitchf, yawf;
+   float sgFGD_COORD[4][4];
    struct list_ele *next, *prev;
 };
 
-struct list_ele *head, *tail, *act, *test;  /*  fgd_msg; */
+struct list_ele *head, *tail, *act, *test, *incoming;  /*  fgd_msg; */
+
+struct fgd_sock_list {
+   char adr[16];
+   int  prev_sock;
+};
+
+struct fgd_sock_list fgd_cli_list[255];
+int fgd_known_cli = -1;   /* False */
+int fgd_cli = 0;
 
 /*...Create head and tail of list */
 void list_init( void) {
+   incoming = (struct list_ele*) malloc(sizeof(struct list_ele));
    head = (struct list_ele*) malloc(sizeof(struct list_ele));
    tail = (struct list_ele*) malloc(sizeof(struct list_ele));
    if (head == NULL || tail == NULL) { printf("Out of memory\n"); exit(1); }
 /* fixme :Where is the "with foobar do command "
    head->ipadr = "127.0.0.0";
-   head->squak = "None";
+   strcpy(head->callsign, "None");
    head->lon = 0;
    head->lat = 0;   
    head->alt = 0;   
@@ -80,7 +101,7 @@ void list_init( void) {
    head->roll = 0;
    head->yaw = 0;
 */   
-       /* yaw!. Who the f$%& invented this ;-) */
+   /* yaw!. Who the f$%& invented this ;-) */
    head->ipadr[0] = 0;
    tail->ipadr[0] = 255;
    tail->ipadr[1] = 0;
@@ -92,18 +113,69 @@ void list_init( void) {
 void list_output( void) {
 }
 
+void list_search( char name[16]) {
+
+   if (strcmp(name, head->next->ipadr) <= 0)     act = head;
+   else if (strcmp(name, tail->prev->ipadr) > 0) act = tail->prev;
+   else {
+      int vergleich = strcmp(name, act->ipadr);
+      if (vergleich > 0)
+         while (strcmp(name, act->next->ipadr) > 0) {
+            act = act->next;
+         }
+      else if (vergleich < 0)
+         while (strcmp(name, act->ipadr) < 0) {
+            act = act->prev;
+         }
+      else
+         while (strcmp(name, act->ipadr) == 0) {
+            act = act->prev;
+         }
+   }
+}
+
 void list_insert( char newip[16]) {
 struct list_ele *new_ele;
 
    new_ele = (struct list_ele*) malloc(sizeof(struct list_ele));
    if (new_ele == NULL) { printf("Out of memory\n"); exit(1); }
    strcpy(new_ele->ipadr, newip);
+/* setting default */   
+   strcpy(new_ele->callsign, "not assigned");
    list_search( newip);
    new_ele->prev = act;
    new_ele->next = act->next;
    act->next->prev = act->next = new_ele;
 }
 
+void list_setval( char newip[16]) {
+
+   list_search( newip);
+   strcpy( act->next->callsign, incoming->callsign);
+   act->next->latf = incoming->latf;
+   act->next->lonf = incoming->lonf;
+   act->next->altf = incoming->altf;
+   act->next->speedf = incoming->speedf;
+   act->next->rollf = incoming->rollf;
+   act->next->pitchf = incoming->pitchf;
+   act->next->yawf = incoming->yawf;
+   printf("Callsign %s ", act->next->callsign);
+   printf(" lat: %7.3f lon: %7.3f alt: %7.3f speed: %7.3f roll: %7.3f pitch: %7.3f yaw: %7.3f",
+            act->next->latf, act->next->lonf, act->next->altf, act->next->speedf,
+            act->next->rollf, act->next->pitchf, act->next->yawf);
+}
+
+void list_setval_Mat4( char newip[16]) {
+
+   list_search( newip);
+   strcpy( act->next->callsign, incoming->callsign);
+   for (i=0;i<4;i++)
+     for (j=0;j<4;j++) 
+       act->next->sgFGD_COORD[i][j] = incoming->sgFGD_COORD[i][j];
+   printf("Callsign %s ", act->next->callsign);
+}
+
+
 void list_clear( char clrip[16]) {
 struct list_ele *clr_ele;
 
@@ -118,26 +190,6 @@ struct list_ele *clr_ele;
    }
 }
 
-void list_search( char name[16]) {
-
-   if (strcmp(name, head->next->ipadr) <= 0)     act = head;
-   else if (strcmp(name, tail->prev->ipadr) > 0) act = tail->prev;
-   else {
-      int vergleich = strcmp(name, act->ipadr);
-      if (vergleich > 0)
-         while (strcmp(name, act->next->ipadr) > 0) {
-            act = act->next;
-         }
-      else if (vergleich < 0)
-         while (strcmp(name, act->ipadr) < 0) {
-            act = act->prev;
-         }
-      else
-         while (strcmp(name, act->ipadr) == 0) {
-            act = act->prev;
-         }
-   }
-}
 
 int list_not_in( char name[16]) {
    
@@ -146,7 +198,7 @@ int list_not_in( char name[16]) {
    while ((test != tail) && (i==True)) {
      i = (strcmp(test->ipadr, name) ? True : False);
      test = test->next;
-     printf("list_not_in : %d\n",i);
+     if (verbose != 0) printf("list_not_in : %d\n",i);
    }
    return(i);
 }
@@ -154,24 +206,26 @@ int list_not_in( char name[16]) {
 
 
 
-int i;
 int sock = -1;
 int my_sock;
 int fgd_com;
+int *ip;
 size_t anz;
-char *buff;
-struct { char *adr, *squak, *lon, *lat, *alt;} fgd_client;
+char buff[1024];
+char *fgd_name;
+struct { char *adr, *lon, *lat, *alt;} fgd_client;
 int fgd_ele_len;
 
 struct sockaddr_in address;
 struct sockaddr_in my_address;
 int result;
-extern char *sys_errlist[];
+socklen_t size = sizeof(address);
+
+
 extern int errno;
 int current_port = 0; 
 u_short base_port = 0;
 u_short end_port = 1024;
-int verbose = 0;
 struct hostent *host_info;
 struct servent *service_info;
 
@@ -179,23 +233,24 @@ void fgd_init(void);
 
 int main(int argc, char **argv)
 { 
-   if (argc < 3) {
-    fprintf(stderr,"Usage: fgd [start port] [end port] <-v or -vv>\n");
+   if (argc < 4) {
+    fprintf(stderr,"Usage: fgd [start port] [end port] [name] <-v or -vv>\n");
     exit(1);
    }
    
    switch (argc) {
-     case 4: if (!strcmp(argv[3],"-v")) 
+     case 5: if (!strcmp(argv[4],"-v")) 
                verbose = 1;
-             else if (!strcmp(argv[3],"-vv"))
+             else if (!strcmp(argv[4],"-vv"))
                     verbose = 2;
-               else { fprintf(stderr,"Usage: fgd [start port] [end port] <-v or -vv>\n");
+               else { fprintf(stderr,"Usage: fgd [start port] [end port] [name] <-v or -vv>\n");
                       exit(1); }
 
-     case 3: base_port = (u_short)atoi(argv[1]);
+     case 4: base_port = (u_short)atoi(argv[1]);
              end_port = (u_short)atoi(argv[2]);
+             fgd_name = argv[3];
              break;
-     default: fprintf(stderr,"Usage: fgd [start port] [end port] <-v or -vv>\n");
+     default: fprintf(stderr,"Usage: fgd [start port] [end port] [name] <-v or -vv>\n");
               exit(1);
               break;
    }
@@ -203,9 +258,9 @@ int main(int argc, char **argv)
    bzero((char *)&address, sizeof(address));
    address.sin_family = AF_INET;
    if (uname(&myname) == 0) fgd_host = myname.nodename;
-   printf("I am running on HOST : %s\n", fgd_host);
+   printf(" I am running as %s on HOST %s\n", fgd_name, fgd_host);
 
-   if (verbose == 2) printf("Resolving: %s ->",fgd_host);
+   if (verbose == 2) printf(" Resolving: %s ->",fgd_host);
    if (host_info = gethostbyname(fgd_host)) {
      bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
      printf(" fgd : ip = %s\n", inet_ntoa( address.sin_addr));
@@ -221,11 +276,11 @@ int main(int argc, char **argv)
      fprintf(stderr,"Bad port range : start=%d end=%d !\n");
      exit(1);
    } else if (verbose == 2) {
-            printf("Port range: %d to %d\n",base_port,end_port);
+            printf(" Port range: %d to %d\n",base_port,end_port);
      }
-   vb = (char) &verbose;
-   printf("vb %s",&vb);
-   exit(0);
+   printf(" verbose: %d\n",verbose);
+   /* some init stuff */
+   fgd_txt = (char *) malloc(1024);
    list_init();
    fgd_init();
    exit(0);
@@ -233,7 +288,7 @@ int main(int argc, char **argv)
 
 void fgd_init(void) {
 
-struct { char *ip, *squak, *lon, *lat, *alt;} fg_id;
+struct { char *ip, *lon, *lat, *alt;} fg_id;
 
 
    current_port = base_port;
@@ -246,9 +301,13 @@ struct { char *ip, *squak, *lon, *lat, *alt;} fg_id;
      } 
 
     address.sin_port = htons(current_port);
-    printf("address.sin_port : %d\n",htons(address.sin_port));
+    if (verbose == 2) printf(" address.sin_port : %d\n",htons(address.sin_port));
     if (1 == 1) {
-    bind(sock, (struct sockaddr *)&address, sizeof(address));
+    if ( bind(sock, (struct sockaddr *)&address, sizeof(address)) == -1) {
+         printf(" Aiiiieeehh...ADRESS ALSO IN USE...\7hmmm...please check another port\n");
+         printf(" Just wait a few seconds or do a netstat to see the port status.\n");
+         exit(-1);
+    }
     listen(sock, 5);
 
 /* Hier neu */
@@ -261,80 +320,310 @@ for (;;){
     tv.tv_usec = 0;
     nready = select( sock + 1, &rset, NULL, NULL, &tv);
     if (FD_ISSET( sock, &rset)) {
-      my_sock = accept( sock, (struct sockaddr *)&address, sizeof(address));
+      my_sock = accept( sock, (struct sockaddr *)&address, &size);
       anz = 2;
-
 /* reading length of senders' ip */
       fgd_ele_len =  0;
-      buff = "";
-      read( my_sock, &buff, 1);
-      fgd_ele_len =  (int)(char) buff;
+      read( my_sock, buff, 1);
+      fgd_ele_len =  buff[0];      
+      if (verbose == 2) printf("ele_len %d\n", fgd_ele_len);  
 /* reading senders' ip */
       read( my_sock, &buff, fgd_ele_len);
-      fgd_client.adr = inet_ntoa(buff);
+      ip = (int *) buff;
+//      printf("%d %d %d %d   %x   %x  %x\n", buff[0], buff[1], buff[2], buff[3], &ip, ip, *ip);
+      fgd_client.adr = (char*) inet_ntoa( *ip);
       src_host = fgd_client.adr;
 /* reading commando */
       read( my_sock, &buff, 1);
+/* closing previous file descriptor of same client, at least we know now 
+   that the previous command is finished since it's the same client who 
+   again requests something. Maybe I'm to quick and diiirty ;-) */
+      printf("FGD : Using socket #%d\n", my_sock);
+      fgd_known_cli = False;
+      for ( fgd_cnt = 1; fgd_cnt < fgd_cli+1; fgd_cnt++) {
+        printf("FGD : fgd_cnt:%d  fgd_cli:%d  fgd_client.adr: %s  prev.sock:%d  fgd_cli_list[fgd_cnt].adr: %s\n",
+                      fgd_cnt, fgd_cli, fgd_client.adr, 
+                      fgd_cli_list[fgd_cnt].prev_sock, fgd_cli_list[fgd_cnt].adr);
+        if ( strcmp( fgd_cli_list[fgd_cnt].adr, fgd_client.adr) == 0) {
+             printf("FGD : In Vergleichsloop. Closing socket: %d\n",
+                      fgd_cli_list[fgd_cnt].prev_sock);
+             close( fgd_cli_list[fgd_cnt].prev_sock);
+             fgd_cli_list[fgd_cnt].prev_sock = my_sock;
+             fgd_known_cli = True;
+        }
+      }
+      if ( fgd_known_cli == False) {
+           fgd_cli++;
+           fgd_cli_list[fgd_cli].prev_sock = my_sock;
+           strcpy(fgd_cli_list[fgd_cli].adr, fgd_client.adr);
+      }
       printf(" Commando received : %s from Host : %s\n", &buff, src_host);
-      fgd_com = (int) atoi(&buff);
+      fgd_com = ( (char) buff[0]) - 0x30;
+      printf("%d \n", fgd_com);
       switch (fgd_com) {
       case 0:  printf(" fgd   : Identify\n");
-                write( my_sock, "FGD", 3);                
-                close(my_sock);
+                sprintf( (char*) buff, "FGDLH%s", fgd_name);
+                buff[3] = strlen(fgd_name) + 1;     /* Lo, incl.zero      */
+                buff[4] = 0;                        /* Hi, names < 0xff ! */
+                buff[buff[3] + 4] = 0;              /* Term.zero */
+                printf(" I am  : %s\n", fgd_name);
+                write( my_sock, &buff, buff[3]+5);  /* fgd housekeeping ;-) */
+     //           close(my_sock);
                 break;      
       case 1:  printf(" fgd   : Register\n");
       /* reading length of FGFS_host ip */
                 fgd_ele_len =  0;
-                buff = "";
                 read( my_sock, &buff, 1);
-                fgd_ele_len =  (int)(char) buff;
+                fgd_ele_len =  (int) &buff;
       /* reading FGFS_host ip */
                 read( my_sock, &buff, fgd_ele_len);
-                fgd_client.adr = inet_ntoa(buff);
-               if (list_not_in(fgd_client.adr) == True) list_insert(fgd_client.adr);
-               printf("    IP : %s\n", fgd_client.adr);
-               printf(" PILOT : %s\n", "OLK");
-               printf("   LON : %s\n", "42.26");
-               printf("   LAT : %s\n", "21.89");
-               printf("   ALT : %s\n", "6000");
-               close(my_sock);
+                ip = (int *) buff;
+                fgd_client.adr = (char*) inet_ntoa( *ip);
+               if (list_not_in(fgd_client.adr) == True) {
+                   list_insert(fgd_client.adr);
+                   list_search(fgd_client.adr);
+//                    strcpy(act->callsign, "None");
+                    printf(" Setting default values\n");
+                    printf("    IP : %s\n", act->next->ipadr);
+                    printf(" PILOT : %s\n", act->next->callsign);                    
+                    }
+      /* writing answer back to client */
+                sprintf( (char*) buff, "FGDLH%s", fgd_client.adr);
+                buff[3] = strlen(fgd_client.adr) + 1;     /* Lo, incl.zero      */
+                buff[4] = 0;                        /* Hi, names < 0xff ! */
+                buff[buff[3] + 4] = 0;              /* Term.zero */
+                write( my_sock, &buff, buff[3]+5);  /* fgd housekeeping ;-) */
+ //               close(my_sock);
                break;
       case 2:  printf(" fgd   : Show Registered\n");
+                sprintf( (char*) buff, "FGD");
+                // buff[3] = buff[4] = 0;
+                fgd_cnt = 0;
+                fgd_curpos = 6;
                test = head->next;
                while (test != tail) { 
-                  printf("    ip : %s\n", test->ipadr);
+                  printf("    IP : %s\n", test->ipadr);
+                  fgd_cnt++;
+                  fgd_ele_len = strlen(test->ipadr) + 1;
+//                        printf(" ele_len %d  curpos %d\n", fgd_ele_len, fgd_curpos);
+                  buff[fgd_curpos] = fgd_ele_len;
+                  fgd_curpos++;
+                  bcopy(test->ipadr, &buff[fgd_curpos], fgd_ele_len);
+                  fgd_curpos += fgd_ele_len;
+                  //buff[fgd_curpos] = 0;
                   test = test->next;
                }
-               close(my_sock);
-               break;                  
+               if (fgd_cnt == 0) fgd_curpos--;
+               buff[3] = fgd_curpos & 0xff;
+               buff[4] = fgd_curpos >> 8;
+               buff[5] = fgd_cnt;
+               write( my_sock, &buff, fgd_curpos);
+//                     close(my_sock);
+               break;
       case 3:  printf(" fgd   : Send MSG\n");
-                close(my_sock);
+//                close(my_sock);
                break;
       case 4:  printf(" fgd   : Send MSG to all\n");
-               close(my_sock);
+//                     close(my_sock);
                break;                  
-      case 5:  printf(" fgd   : Scan for fgd's\n");
-               close(my_sock);
-               break;                          
-      case 6:  printf(" fgd   : Update\n");
-               close(my_sock);
+      case 5:  printf(" fgd   : Get DATA from client\n");
+               read( my_sock, &buff, 1);
+               fgd_ele_len = buff[0];
+               read( my_sock, &buff, fgd_ele_len);
+               ip = (int *) buff;
+               fgd_client.adr = (char*) inet_ntoa( *ip);
+               printf("    IP : %s\n", fgd_client.adr);
+               if (verbose != 0) printf("not_in (CASE) : %d\n", list_not_in(fgd_client.adr));
+               if (list_not_in(fgd_client.adr) == False) {
+                   printf(" Checkpoint\n");
+                    read( my_sock, &buff, 1);
+                    printf(" Checkpoint 1\n");
+                   fgd_ele_len = buff[0];
+                   read( my_sock, &buff, fgd_ele_len);
+                   incoming->callsign[fgd_ele_len] = 0;
+                    bcopy( &buff, incoming->callsign, fgd_ele_len);
+                /* lat, lon */
+                    read( my_sock, &buff, 56);
+                    sscanf( buff," %7f %7f %7f %7f %7f %7f %7f", &incoming->latf, &incoming->lonf,
+                           &incoming->altf, &incoming->speedf, &incoming->rollf,
+                           &incoming->pitchf, &incoming->yawf);
+                    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",
+                            incoming->latf, incoming->lonf, incoming->altf, incoming->speedf,
+                            incoming->rollf, incoming->pitchf, incoming->yawf);
+                   list_setval(fgd_client.adr);
+                    }
+                    else strcpy( fgd_client.adr, "UNKNOWN");
+      /* writing answer back to client */
+                sprintf( (char*) buff, "%sLH%s ", "FGD", fgd_client.adr);
+                buff[3] = strlen(fgd_client.adr) + 1;
+                buff[4] = 0;
+                buff[ buff[3] + 4] = 0;
+                printf("    IP : %s\n", fgd_client.adr);
+                write( my_sock, &buff, buff[3]+5);
+//                     close(my_sock);
+               break;
+      case 17: printf(" fgd   : Get Mat4 DATA from client\n");
+               read( my_sock, &buff, 1);
+               fgd_ele_len = buff[0];
+               read( my_sock, &buff, fgd_ele_len);
+               ip = (int *) buff;
+               fgd_client.adr = (char*) inet_ntoa( *ip);
+               printf("    IP : %s\n", fgd_client.adr);
+               if (verbose != 0) printf("not_in (CASE) : %d\n", list_not_in(fgd_client.adr));
+               if (list_not_in(fgd_client.adr) == False) {
+                   printf(" Checkpoint\n");
+                    read( my_sock, &buff, 1);
+                    printf(" Checkpoint 1\n");
+                   fgd_ele_len = buff[0];
+                   read( my_sock, &buff, fgd_ele_len);
+                   incoming->callsign[fgd_ele_len] = 0;
+                    bcopy( &buff, incoming->callsign, fgd_ele_len);
+                /* lat, lon */
+                    read( my_sock, &buff, 158);
+                    i = sscanf( buff," %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
+                            &incoming->sgFGD_COORD[0][0], &incoming->sgFGD_COORD[0][1], &incoming->sgFGD_COORD[0][2], &incoming->sgFGD_COORD[0][3],
+                            &incoming->sgFGD_COORD[1][0], &incoming->sgFGD_COORD[1][1], &incoming->sgFGD_COORD[1][2], &incoming->sgFGD_COORD[1][3],
+                            &incoming->sgFGD_COORD[2][0], &incoming->sgFGD_COORD[2][1], &incoming->sgFGD_COORD[2][2], &incoming->sgFGD_COORD[2][3],
+                            &incoming->sgFGD_COORD[3][0], &incoming->sgFGD_COORD[3][1], &incoming->sgFGD_COORD[3][2], &incoming->sgFGD_COORD[3][3]);
+
+//                    printf(" sscanf input: %d\n",i);
+                    printf(" sgMat4: \n%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n",
+                                           incoming->sgFGD_COORD[0][0], incoming->sgFGD_COORD[0][1], incoming->sgFGD_COORD[0][2], incoming->sgFGD_COORD[0][3],
+                                           incoming->sgFGD_COORD[1][0], incoming->sgFGD_COORD[1][1], incoming->sgFGD_COORD[1][2], incoming->sgFGD_COORD[1][3],
+                                           incoming->sgFGD_COORD[2][0], incoming->sgFGD_COORD[2][1], incoming->sgFGD_COORD[2][2], incoming->sgFGD_COORD[2][3],
+                                           incoming->sgFGD_COORD[3][0], incoming->sgFGD_COORD[3][1], incoming->sgFGD_COORD[3][2], incoming->sgFGD_COORD[3][3]);
+                   list_setval_Mat4(fgd_client.adr);
+                    }
+                    else strcpy( fgd_client.adr, "UNKNOWN");
+      /* writing answer back to client */
+                sprintf( (char*) buff, "FGDLH%s", fgd_client.adr);
+                buff[3] = strlen(fgd_client.adr) + 1;
+                buff[4] = buff[buff[3]+5] = 0;
+                printf("    IP : %s\n", fgd_client.adr);
+                write( my_sock, &buff, buff[3]+5);
+//                     close(my_sock);
+               break;
+      case 6:  printf(" fgd   : Send all DATA to client\n");
+                sprintf( (char*) buff, "%s %s", "FGD", fgd_client.adr);
+                buff[3] = 0;
+                fgd_cnt = 0;
+                fgd_curpos = 6;
+               test = head->next;
+               while (test != tail) { 
+                  printf("    IP : %-16s  Callsign : %-16s\n", test->ipadr, test->callsign);
+                  fgd_cnt++;
+               /* IP */
+                  fgd_ele_len = strlen(test->ipadr);
+                   printf(" ele_len %d  curpos %d\n", fgd_ele_len, fgd_curpos);
+                  buff[fgd_curpos] = fgd_ele_len;
+                  fgd_curpos++;
+                  bcopy(test->ipadr, &buff[fgd_curpos], fgd_ele_len);
+                  fgd_curpos = fgd_curpos + fgd_ele_len;
+               /* Callsign */
+                  fgd_ele_len = strlen(test->callsign);
+                   printf(" ele_len %d  curpos %d\n", fgd_ele_len, fgd_curpos);
+                  buff[fgd_curpos] = fgd_ele_len;
+                  fgd_curpos++;
+                  bcopy(test->callsign, &buff[fgd_curpos], fgd_ele_len);
+                  fgd_curpos = fgd_curpos + fgd_ele_len;
+                /* Lat, Lon, Alt, Speed, Roll, Pitch, Yaw
+                   hope this sprintf call is not too expensive */
+                   sprintf( fgd_txt, " %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f",
+                            test->latf, test->lonf, test->altf, test->speedf,
+                            test->rollf, test->pitchf, test->yawf);
+                   printf(" ele_len %d  curpos %d\n", fgd_ele_len, fgd_curpos);
+                   printf(" Data : %s\n", fgd_txt);
+                   bcopy((char *) fgd_txt, &buff[fgd_curpos], 56);
+                   fgd_curpos += 56;
+                  test = test->next;
+               }
+               if (fgd_cnt == 0) fgd_curpos --;
+               printf(" ele_len %d  curpos %d\n", fgd_ele_len, fgd_curpos);
+               buff[3] = fgd_curpos;
+               buff[4] = fgd_curpos / 256;
+               buff[5] = fgd_cnt;
+               write( my_sock, &buff, fgd_curpos);
+//                     close(my_sock);
+               break;
+      case 18: printf(" fgd   : Send all Mat4 DATA to client\n");
+                sprintf( (char*) buff, "FGDLH");
+                buff[3] = buff[4] = 0;
+                fgd_cnt = 0;
+                fgd_curpos = 6;
+               test = head->next;
+               while (test != tail) { 
+                  printf("    IP : %-16s  Callsign : %-16s\n", test->ipadr, test->callsign);
+                  fgd_cnt++;
+               /* IP */
+                  fgd_ele_len = strlen(test->ipadr);
+                   printf(" ele_len %d  curpos %d\n", fgd_ele_len, fgd_curpos);
+                  buff[fgd_curpos] = fgd_ele_len;
+                  fgd_curpos++;
+                  bcopy(test->ipadr, &buff[fgd_curpos], fgd_ele_len);
+                  fgd_curpos = fgd_curpos + fgd_ele_len;
+               /* Callsign */
+                  fgd_ele_len = strlen(test->callsign);
+                   printf(" ele_len %d  curpos %d\n", fgd_ele_len, fgd_curpos);
+                  buff[fgd_curpos] = fgd_ele_len;
+                  fgd_curpos++;
+                  bcopy(test->callsign, &buff[fgd_curpos], fgd_ele_len);
+                  fgd_curpos = fgd_curpos + fgd_ele_len;
+                /* Lat, Lon, Alt, Speed, Roll, Pitch, Yaw
+                   hope this sprintf call is not too expensive */
+                   fgd_len_msg = sprintf( fgd_txt, " %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
+                          test->sgFGD_COORD[0][0], test->sgFGD_COORD[0][1], test->sgFGD_COORD[0][2], test->sgFGD_COORD[0][3],
+                          test->sgFGD_COORD[1][0], test->sgFGD_COORD[1][1], test->sgFGD_COORD[1][2], test->sgFGD_COORD[1][3],
+                          test->sgFGD_COORD[2][0], test->sgFGD_COORD[2][1], test->sgFGD_COORD[2][2], test->sgFGD_COORD[2][3],
+                          test->sgFGD_COORD[3][0], test->sgFGD_COORD[3][1], test->sgFGD_COORD[3][2], test->sgFGD_COORD[3][3]);
+                 fgd_txt[fgd_len_msg] = 0;
+                   printf(" ele_len %d  curpos %d\n", fgd_ele_len, fgd_curpos);
+                   printf(" Data : %s\n", fgd_txt);
+                   bcopy((char *) fgd_txt, &buff[fgd_curpos], fgd_len_msg+1);
+                   fgd_curpos += fgd_len_msg+1;
+                  test = test->next;
+               }
+               if (fgd_cnt == 0) fgd_curpos -= 1;
+               printf(" ele_len %d  curpos %d\n", fgd_ele_len, fgd_curpos);
+               buff[3] = fgd_curpos & 0xff;
+               buff[4] = fgd_curpos / 256;
+               buff[5] = fgd_cnt;
+               printf("ANZ: %d  CURPOS: %d\n", (unsigned char) buff[3] + (unsigned char) buff[4] * 256, fgd_curpos);
+               write( my_sock, &buff, fgd_curpos);
+//                     close(my_sock);
                break;
       case 8:  printf(" fgd   : Unregister\n");
                read( my_sock, &buff, 1);
                fgd_ele_len = (int) &buff;
                read( my_sock, &buff, fgd_ele_len);
-               fgd_client.adr = inet_ntoa(buff);
+               ip = (int *) buff;
+               fgd_client.adr = (char*) inet_ntoa( *ip);
                printf("    IP : %s\n", fgd_client.adr);
-               printf("not_in (CASE) : %d\n", list_not_in(fgd_client.adr));
-               
-               if (list_not_in(fgd_client.adr) == -1) list_clear(fgd_client.adr);
-                close(my_sock);
+               if (verbose != 0) printf("not_in (CASE) : %d\n", list_not_in(fgd_client.adr));
+               if (list_not_in(fgd_client.adr) == -1) {
+                   list_clear(fgd_client.adr);
+                    }
+                    else strcpy( fgd_client.adr, "UNKNOWN");
+      /* writing answer back to client */
+                sprintf( (char*) buff, "FGDLH%s", fgd_client.adr);
+                buff[3] = strlen(fgd_client.adr) + 1;
+                buff[4] = buff[buff[3]+5] = 0;
+                printf("    IP : %s\n", fgd_client.adr);
+                write( my_sock, &buff, buff[3]+5);                    
+//  Just leaving the old stuff in, to correct it for FGFS later...
+//  I'm sick of this f$%&ing libc5/glibc2.0/2.1 quirks
+//  Oliver...very angry...
+//      /* writing answer back to client */
+//                sprintf( (char*) buff, "%s %s", "FGD", fgd_client.adr);
+//                buff[3] = strlen(fgd_client.adr);
+//                printf("    IP : %s\n", fgd_client.adr);
+//                write( my_sock, &buff, buff[3]+4);
+//                close(my_sock);
                break;  
       case 9:  printf(" fgd   : Shutdown\n");
                 close(my_sock);
                 close(sock);
                 exit(0);                               
-      default: printf(" fgd   : Illegal Command\n");
+      default: printf(" fgd   : Huh?...Unknown Command\n");
                 break;
       }
     }
@@ -368,4 +657,3 @@ for (;;){
 
   if (verbose == 2) printf("Port scan finished !\n");
 }
-