Initial revision.
This commit is contained in:
parent
b67e68b684
commit
e2a7fb6080
6 changed files with 914 additions and 0 deletions
30
src/NetworkOLK/Tools/Makefile
Normal file
30
src/NetworkOLK/Tools/Makefile
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
CPPFLAGS =
|
||||||
|
CFLAGS =
|
||||||
|
CC = gcc
|
||||||
|
RM = rm
|
||||||
|
PROGS = fgd fgd_scan fgd_com
|
||||||
|
BINDIR = /usr/local/bin
|
||||||
|
|
||||||
|
all: $(PROGS)
|
||||||
|
|
||||||
|
fgd: fgd.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
fgd_scan: fgd_scan.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
fgd_com: fgd_com.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) -f *.o $(PROGS) *~ core
|
||||||
|
|
||||||
|
install: all devs
|
||||||
|
install -d $(BINDIR)
|
||||||
|
install $(PROGS) $(BINDIR)
|
||||||
|
install -d $(MANDIR)/man4
|
||||||
|
install -m 644 js.4 $(MANDIR)/man4
|
||||||
|
|
||||||
|
dist: clean
|
||||||
|
tar czf ../`basename \`pwd\``.tar.gz -C .. `basename \`pwd\``
|
||||||
|
|
117
src/NetworkOLK/Tools/README
Normal file
117
src/NetworkOLK/Tools/README
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
Welcome to FlightGear Deamon fgd
|
||||||
|
--------------------------------
|
||||||
|
Here the first Tools to play with FlightGear Deamon.
|
||||||
|
This is yet pre-alpha and the sources remain to be tidied up,
|
||||||
|
and to get documented.
|
||||||
|
|
||||||
|
|
||||||
|
Theory of operation:
|
||||||
|
--------------------
|
||||||
|
The FlightGear Deamon called fgd is a standalone program which registers
|
||||||
|
FGFS players willing to have a multiplayer FGFS environment via TCP/IP.
|
||||||
|
Information like player's ip/lon/lat/alt etc. can be send to fgd.
|
||||||
|
The deamon fgd in turn sends back the gathered information upon request.
|
||||||
|
The purpose of the scan prog "fgd_scan" is to locate free ports on the
|
||||||
|
network, which can be used for exchanging data between FGFS and fgd.
|
||||||
|
The commando program fgd_com serves as an example of how the communication
|
||||||
|
to fgd can be done. For the moment consider fgd_com as FGFS.
|
||||||
|
Parts of fgd_com will be later incorporated into FGFS.
|
||||||
|
|
||||||
|
|
||||||
|
How to play with the tools:
|
||||||
|
---------------------------
|
||||||
|
Just fire up fgd on whatever machine reachable from the one on which
|
||||||
|
FGFS will be running. Even the same machine is ok.
|
||||||
|
Then use fgd_scan to locate the fgd-deamon.
|
||||||
|
Also use fgd_com to pass some commandos to fgd.
|
||||||
|
|
||||||
|
|
||||||
|
How to compile:
|
||||||
|
---------------
|
||||||
|
Use the Makefile with make or just gcc -o prog prog.c
|
||||||
|
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
------
|
||||||
|
- fgd [start port] [end port] <-v -vv>
|
||||||
|
|
||||||
|
where
|
||||||
|
- start port and end port is the range where it should listen and
|
||||||
|
talk to. (Later the range will be used to check for a free port
|
||||||
|
within this range, which can be used for communicating with FGFS.
|
||||||
|
for the moment make sure you use the _SAME_ port value for start
|
||||||
|
and stop. A good starting point should be above 10000.
|
||||||
|
- -v or -vv is the verbose level. This param can be ommitted.
|
||||||
|
|
||||||
|
|
||||||
|
- fgd_scan [host] [start port] [end port] <-v -vv>
|
||||||
|
|
||||||
|
comment: params are the same as for fgd except that the start-stop range
|
||||||
|
must be different to detect fgd.
|
||||||
|
|
||||||
|
Also host means the host running fgd, not where the scanner is
|
||||||
|
fired up.
|
||||||
|
|
||||||
|
Just for fun you can take also the dangerous (priviledged ports)
|
||||||
|
But the fgd-scanner will be stuck at some used ports.
|
||||||
|
It doesn't hurt to experiment in the used regions, a ctrl-c
|
||||||
|
will abort the scanning so that new params can be used.
|
||||||
|
|
||||||
|
|
||||||
|
- fgd_com [FGD-host] [start port] [end port] [-v -vv] [commando] <FGFS-host>
|
||||||
|
|
||||||
|
comment: see fgd_scan, but you must enter either a ip/fqdn or dummystring as
|
||||||
|
last param, some commandos use it to pass it as real information to
|
||||||
|
fgd.
|
||||||
|
|
||||||
|
|
||||||
|
The commandos for fgd_com:
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
0 : fgd idenditfies itself, answeres back to scanner
|
||||||
|
1 : registering to fgd
|
||||||
|
2 : show who's registered
|
||||||
|
3 : send message to one specific user (not implemented yet)
|
||||||
|
4 : send message to all users (not implemented yet)
|
||||||
|
5 : scan for other fgd's (not implemented yet)
|
||||||
|
6 : update (fgd sends it's database to user) (not implemented yet)
|
||||||
|
8 : unregister from fgd
|
||||||
|
9 : shutdown fgd
|
||||||
|
|
||||||
|
Comments:
|
||||||
|
---------
|
||||||
|
Commands 1/2/8 use the last parameter (see above, dummy-string) for the
|
||||||
|
ip or hostname or fqdn of the fgfs-machine which will be added/listed/removed
|
||||||
|
from fgd.
|
||||||
|
Try registering and unregistering various hosts to see if the add/remove
|
||||||
|
mechanism works well. It should work correctly.
|
||||||
|
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
---------
|
||||||
|
- fgd olk 10003 10003 -vv
|
||||||
|
fgd runs on host "olk" using port "10003" using max. verbose level
|
||||||
|
|
||||||
|
- fgd_com olk 10003 10003 -vv 1 johnny
|
||||||
|
send "register host"-command to fgd running on host "olk" using port"10003"
|
||||||
|
and register machine "johnny"
|
||||||
|
|
||||||
|
To do:
|
||||||
|
------
|
||||||
|
- clean-up code
|
||||||
|
- document the code
|
||||||
|
- convert code from c to c++
|
||||||
|
- find a place within FGFS where to reside
|
||||||
|
- make the code more autodetectable, to reduce commandline params
|
||||||
|
- implement missing commands
|
||||||
|
- find other useful commands
|
||||||
|
- find and resolve bugs ;-)
|
||||||
|
|
||||||
|
|
||||||
|
REMEMBER:
|
||||||
|
---------
|
||||||
|
This 3 toys are pre-alpha and dirty and need also to be documented.
|
||||||
|
|
||||||
|
Send comments/flame/beer/whatever to delise@rp-plus.de
|
||||||
|
|
||||||
|
Oliver Delise 25/May/99
|
11
src/NetworkOLK/Tools/fg_header.txt
Normal file
11
src/NetworkOLK/Tools/fg_header.txt
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
These includes must be available on any Un*x, Windoze and Mac Donald's
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/utsname.h>
|
371
src/NetworkOLK/Tools/fgd.c
Normal file
371
src/NetworkOLK/Tools/fgd.c
Normal file
|
@ -0,0 +1,371 @@
|
||||||
|
/***********************************************************/
|
||||||
|
/* 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 */
|
||||||
|
/***********************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Net-stuff */
|
||||||
|
fd_set rset, allset;
|
||||||
|
int maxfd, nready, retval;
|
||||||
|
struct timeval tv;
|
||||||
|
struct utsname myname;
|
||||||
|
char *fgd_host, *src_host;
|
||||||
|
|
||||||
|
/* List-stuff (doubly-Linked-list) */
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int i,j;
|
||||||
|
char *vb;
|
||||||
|
const int True = 0;
|
||||||
|
const int False= -1;
|
||||||
|
|
||||||
|
struct list_ele {
|
||||||
|
unsigned char ipadr[16], squak[16];
|
||||||
|
float *lon, *lat, *alt, *roll, *pitch, *yaw;
|
||||||
|
struct list_ele *next, *prev;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct list_ele *head, *tail, *act, *test; /* fgd_msg; */
|
||||||
|
|
||||||
|
/*...Create head and tail of list */
|
||||||
|
void list_init( void) {
|
||||||
|
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";
|
||||||
|
head->lon = 0;
|
||||||
|
head->lat = 0;
|
||||||
|
head->alt = 0;
|
||||||
|
head->pitch = 0;
|
||||||
|
head->roll = 0;
|
||||||
|
head->yaw = 0;
|
||||||
|
*/
|
||||||
|
/* yaw!. Who the f$%& invented this ;-) */
|
||||||
|
head->ipadr[0] = 0;
|
||||||
|
tail->ipadr[0] = 255;
|
||||||
|
tail->ipadr[1] = 0;
|
||||||
|
head->prev = tail->prev = head;
|
||||||
|
head->next = tail->next = tail;
|
||||||
|
act = head; /* put listpointer to beginning of list */
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_output( void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
list_search( newip);
|
||||||
|
new_ele->prev = act;
|
||||||
|
new_ele->next = act->next;
|
||||||
|
act->next->prev = act->next = new_ele;
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_clear( char clrip[16]) {
|
||||||
|
struct list_ele *clr_ele;
|
||||||
|
|
||||||
|
list_search( clrip);
|
||||||
|
if ( strcmp( clrip, act->next->ipadr))
|
||||||
|
printf("....Name %s nicht vorhanden", clrip);
|
||||||
|
else {
|
||||||
|
clr_ele = act->next;
|
||||||
|
act->next = act->next->next;
|
||||||
|
act->next->prev = act;
|
||||||
|
free( 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]) {
|
||||||
|
|
||||||
|
i = True;
|
||||||
|
test = head->next;
|
||||||
|
while ((test != tail) && (i==True)) {
|
||||||
|
i = (strcmp(test->ipadr, name) ? True : False);
|
||||||
|
test = test->next;
|
||||||
|
printf("list_not_in : %d\n",i);
|
||||||
|
}
|
||||||
|
return(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int sock = -1;
|
||||||
|
int my_sock;
|
||||||
|
int fgd_com;
|
||||||
|
size_t anz;
|
||||||
|
char *buff;
|
||||||
|
struct { char *adr, *squak, *lon, *lat, *alt;} fgd_client;
|
||||||
|
int fgd_ele_len;
|
||||||
|
|
||||||
|
struct sockaddr_in address;
|
||||||
|
struct sockaddr_in my_address;
|
||||||
|
int result;
|
||||||
|
extern char *sys_errlist[];
|
||||||
|
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;
|
||||||
|
|
||||||
|
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");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (argc) {
|
||||||
|
case 4: if (!strcmp(argv[3],"-v"))
|
||||||
|
verbose = 1;
|
||||||
|
else if (!strcmp(argv[3],"-vv"))
|
||||||
|
verbose = 2;
|
||||||
|
else { fprintf(stderr,"Usage: fgd [start port] [end port] <-v or -vv>\n");
|
||||||
|
exit(1); }
|
||||||
|
|
||||||
|
case 3: base_port = (u_short)atoi(argv[1]);
|
||||||
|
end_port = (u_short)atoi(argv[2]);
|
||||||
|
break;
|
||||||
|
default: fprintf(stderr,"Usage: fgd [start port] [end port] <-v or -vv>\n");
|
||||||
|
exit(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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));
|
||||||
|
|
||||||
|
if (verbose == 2) printf(" resolved\n");
|
||||||
|
} else if ((address.sin_addr.s_addr = inet_addr(fgd_host)) == INADDR_NONE) {
|
||||||
|
fprintf(stderr,"Could not get %s host entry !\n",argv[1]);
|
||||||
|
printf(" NOT resolved !!!\n");
|
||||||
|
exit(1);
|
||||||
|
} else if (verbose == 2) printf(" address valid\n");
|
||||||
|
|
||||||
|
if ((base_port > end_port) || ((short)base_port < 0)) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
vb = (char) &verbose;
|
||||||
|
printf("vb %s",&vb);
|
||||||
|
exit(0);
|
||||||
|
list_init();
|
||||||
|
fgd_init();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fgd_init(void) {
|
||||||
|
|
||||||
|
struct { char *ip, *squak, *lon, *lat, *alt;} fg_id;
|
||||||
|
|
||||||
|
|
||||||
|
current_port = base_port;
|
||||||
|
while (current_port <= end_port) {
|
||||||
|
sock = socket(PF_INET, SOCK_STREAM, 0);
|
||||||
|
if (sock == -1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error assigning master socket: %s\n",sys_errlist[errno]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
address.sin_port = htons(current_port);
|
||||||
|
printf("address.sin_port : %d\n",htons(address.sin_port));
|
||||||
|
if (1 == 1) {
|
||||||
|
bind(sock, (struct sockaddr *)&address, sizeof(address));
|
||||||
|
listen(sock, 5);
|
||||||
|
|
||||||
|
/* Hier neu */
|
||||||
|
maxfd = sock;
|
||||||
|
FD_ZERO( &allset);
|
||||||
|
FD_SET( sock, &allset);
|
||||||
|
for (;;){
|
||||||
|
rset = allset;
|
||||||
|
tv.tv_sec = 1;
|
||||||
|
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));
|
||||||
|
anz = 2;
|
||||||
|
|
||||||
|
/* reading length of senders' ip */
|
||||||
|
fgd_ele_len = 0;
|
||||||
|
buff = "";
|
||||||
|
read( my_sock, &buff, 1);
|
||||||
|
fgd_ele_len = (int)(char) buff;
|
||||||
|
/* reading senders' ip */
|
||||||
|
read( my_sock, &buff, fgd_ele_len);
|
||||||
|
fgd_client.adr = inet_ntoa(buff);
|
||||||
|
src_host = fgd_client.adr;
|
||||||
|
/* reading commando */
|
||||||
|
read( my_sock, &buff, 1);
|
||||||
|
printf(" Commando received : %s from Host : %s\n", &buff, src_host);
|
||||||
|
fgd_com = (int) atoi(&buff);
|
||||||
|
switch (fgd_com) {
|
||||||
|
case 0: printf(" fgd : Identify\n");
|
||||||
|
write( my_sock, "FGD", 3);
|
||||||
|
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;
|
||||||
|
/* 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);
|
||||||
|
break;
|
||||||
|
case 2: printf(" fgd : Show Registered\n");
|
||||||
|
test = head->next;
|
||||||
|
while (test != tail) {
|
||||||
|
printf(" ip : %s\n", test->ipadr);
|
||||||
|
test = test->next;
|
||||||
|
}
|
||||||
|
close(my_sock);
|
||||||
|
break;
|
||||||
|
case 3: printf(" fgd : Send MSG\n");
|
||||||
|
close(my_sock);
|
||||||
|
break;
|
||||||
|
case 4: printf(" fgd : Send MSG to all\n");
|
||||||
|
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);
|
||||||
|
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);
|
||||||
|
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);
|
||||||
|
break;
|
||||||
|
case 9: printf(" fgd : Shutdown\n");
|
||||||
|
close(my_sock);
|
||||||
|
close(sock);
|
||||||
|
exit(0);
|
||||||
|
default: printf(" fgd : Illegal Command\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
switch (verbose) {
|
||||||
|
case 0: printf("%d\n",base_port+current_port);
|
||||||
|
break;
|
||||||
|
case 1: service_info = getservbyport(htons(base_port+current_port),"tcp");
|
||||||
|
if (!service_info) {
|
||||||
|
printf("%d -> service name unknown\n",base_port+current_port);
|
||||||
|
} else {
|
||||||
|
printf("%d -> %s\n",base_port+current_port,service_info->s_name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2: service_info = getservbyport(htons(base_port+current_port),"tcp");
|
||||||
|
if (!service_info) {
|
||||||
|
printf("Port %d found. Service name unknown\n",base_port+current_port);
|
||||||
|
} else {
|
||||||
|
printf("Port %d found. Service name: %s\n",base_port+current_port,service_info->s_name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
} else if (errno == 113) {
|
||||||
|
fprintf(stderr,"No route to host !\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* current_port++; */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose == 2) printf("Port scan finished !\n");
|
||||||
|
}
|
||||||
|
|
192
src/NetworkOLK/Tools/fgd_com.c
Normal file
192
src/NetworkOLK/Tools/fgd_com.c
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
/***********************************************************/
|
||||||
|
/* FGD_COM.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-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 */
|
||||||
|
/***********************************************************/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int sock = -1;
|
||||||
|
int my_sock;
|
||||||
|
struct sockaddr_in address;
|
||||||
|
struct sockaddr_in my_address;
|
||||||
|
int result;
|
||||||
|
extern char *sys_errlist[];
|
||||||
|
extern int errno;
|
||||||
|
int current_port = 0;
|
||||||
|
u_short base_port = 0;
|
||||||
|
u_short end_port = 1024;
|
||||||
|
int verbose = 0;
|
||||||
|
struct hostent *host_info, *f_host_info;
|
||||||
|
struct servent *service_info;
|
||||||
|
struct utsname myname;
|
||||||
|
|
||||||
|
size_t anz;
|
||||||
|
char *buff;
|
||||||
|
char *src_host;
|
||||||
|
|
||||||
|
void port_scan( char *FGD_com, char *FGFS_host);
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc < 6) {
|
||||||
|
fprintf(stderr," Usage:\n fgd_com [FGD host] [start port] [end port] [-v or -vv] [Commando] [FGFS host]\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
printf("argc %d argv[5] %s\n",argc,argv[5]);
|
||||||
|
switch (argc) {
|
||||||
|
case 7: printf("fgd commando : %s\n",argv[5]);
|
||||||
|
base_port = (u_short)atoi(argv[2]);
|
||||||
|
end_port = (u_short)atoi(argv[3]);
|
||||||
|
verbose = 2;
|
||||||
|
// src_host = argv[6];
|
||||||
|
break;
|
||||||
|
case 5: if (!strcmp(argv[4],"-v"))
|
||||||
|
verbose = 1;
|
||||||
|
else if (!strcmp(argv[4],"-vv"))
|
||||||
|
verbose = 2;
|
||||||
|
else { fprintf(stderr," Usage:\n fgd_com [FGD host] [start port] [end port] <-v or -vv> [FGFS-host]\n");
|
||||||
|
exit(1); }
|
||||||
|
|
||||||
|
case 4: base_port = (u_short)atoi(argv[2]);
|
||||||
|
end_port = (u_short)atoi(argv[3]);
|
||||||
|
break;
|
||||||
|
default: fprintf(stderr,"Usage:\n fgd_com [FGD host] [start port] [end port] <-v> [FGFS-host]\n");
|
||||||
|
exit(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bzero((char *)&address, sizeof(address));
|
||||||
|
address.sin_family = AF_INET;
|
||||||
|
/* determinating the source/sending host */
|
||||||
|
if (uname(&myname) == 0) src_host = myname.nodename;
|
||||||
|
printf("I'm running on HOST : %s\n", src_host);
|
||||||
|
/* resolving the destination host, here fgd's host */
|
||||||
|
if (verbose == 2) printf("Resolving: %s ->",argv[1]);
|
||||||
|
if (host_info = gethostbyname(argv[1])) {
|
||||||
|
bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
|
||||||
|
if (verbose == 2) printf(" resolved\n");
|
||||||
|
} else if ((address.sin_addr.s_addr = inet_addr(argv[1])) == INADDR_NONE) {
|
||||||
|
fprintf(stderr,"Could not get %s host entry !\n",argv[1]);
|
||||||
|
printf(" NOT resolved !!!\n");
|
||||||
|
exit(1);
|
||||||
|
} else if (verbose == 2) printf(" address valid\n");
|
||||||
|
|
||||||
|
if ((base_port > end_port) || ((short)base_port < 0)) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
port_scan( argv[5], argv[6]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int fgd_len_msg = 1;
|
||||||
|
|
||||||
|
void port_scan( char *FGD_com, char *FGFS_host) {
|
||||||
|
current_port = base_port;
|
||||||
|
printf("Sending : %s\n", FGD_com);
|
||||||
|
while (current_port <= end_port) {
|
||||||
|
/* fprintf(stderr,"Trying port: %d\n",current_port); */
|
||||||
|
sock = socket(PF_INET, SOCK_STREAM, 0);
|
||||||
|
if (sock == -1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error assigning master socket: %s\n",sys_errlist[errno]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
address.sin_port = htons(current_port);
|
||||||
|
printf("address.sin_port : %d\n",htons(address.sin_port));
|
||||||
|
|
||||||
|
f_host_info = gethostbyname(src_host);
|
||||||
|
|
||||||
|
//printf ("src_host : %s", ntohs(f_host_info->h_addr));
|
||||||
|
|
||||||
|
if (connect(sock, (struct sockaddr *)&address, sizeof(address)) == 0) {
|
||||||
|
|
||||||
|
// write( sock, FGD_com, 1);
|
||||||
|
|
||||||
|
fgd_len_msg = (int) sizeof(f_host_info->h_addr);
|
||||||
|
/* send length of sender-ip */
|
||||||
|
write( sock, &fgd_len_msg,1);
|
||||||
|
/* send sender-ip */
|
||||||
|
write( sock, f_host_info->h_addr, fgd_len_msg);
|
||||||
|
/* send commando */
|
||||||
|
write( sock, FGD_com, 1);
|
||||||
|
/* send length of dummy-string, for the moment with _WHO_ to execute commando
|
||||||
|
here: his length of ip */
|
||||||
|
f_host_info = gethostbyname(FGFS_host);
|
||||||
|
fgd_len_msg = (int) sizeof(f_host_info->h_addr);
|
||||||
|
write( sock, &fgd_len_msg,1);
|
||||||
|
|
||||||
|
/* send dummy-string, for the moment with _WHO_ to execute commando
|
||||||
|
here: his ip */
|
||||||
|
write( sock, f_host_info->h_addr, fgd_len_msg);
|
||||||
|
|
||||||
|
printf(" Message : %s\n", FGD_com);
|
||||||
|
switch (verbose) {
|
||||||
|
case 0: printf("%d\n",current_port);
|
||||||
|
break;
|
||||||
|
case 1: service_info = getservbyport(htons(current_port),"tcp");
|
||||||
|
if (!service_info) {
|
||||||
|
printf("%d -> service name unknown\n",current_port);
|
||||||
|
} else {
|
||||||
|
printf("%d -> %s\n",current_port,service_info->s_name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2: service_info = getservbyport(htons(current_port),"tcp");
|
||||||
|
if (!service_info) {
|
||||||
|
printf("Port %d found. Service name unknown\n",current_port);
|
||||||
|
} else {
|
||||||
|
printf("Port %d found. Service name: %s\n",current_port,service_info->s_name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (errno == 113) {
|
||||||
|
fprintf(stderr,"No route to host !\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* fprintf(stderr,"Error %d connecting socket %d to port %d: %s\n",
|
||||||
|
errno,sock,current_port,sys_errlist[errno]); */
|
||||||
|
close(sock);
|
||||||
|
current_port++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose == 2) printf("fgd_com terminated.\n");
|
||||||
|
}
|
||||||
|
|
193
src/NetworkOLK/Tools/fgd_scan.c
Normal file
193
src/NetworkOLK/Tools/fgd_scan.c
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
/***********************************************************/
|
||||||
|
/* FGD_SCAN.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 scan for any FlightGear */
|
||||||
|
/* 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 */
|
||||||
|
/***********************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int sock = -1;
|
||||||
|
int my_sock;
|
||||||
|
struct sockaddr_in address;
|
||||||
|
struct sockaddr_in my_address;
|
||||||
|
int result;
|
||||||
|
extern char *sys_errlist[];
|
||||||
|
extern int errno;
|
||||||
|
int current_port = 20000;
|
||||||
|
u_short base_port = 20000;
|
||||||
|
u_short end_port = 20100;
|
||||||
|
int verbose = 0;
|
||||||
|
struct hostent *host_info, *f_host_info;
|
||||||
|
struct servent *service_info;
|
||||||
|
struct utsname myname;
|
||||||
|
|
||||||
|
size_t anz;
|
||||||
|
char *buff;
|
||||||
|
char *src_host;
|
||||||
|
|
||||||
|
void port_scan( char FGD_com);
|
||||||
|
void fgd_scan();
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc < 4) {
|
||||||
|
fprintf(stderr,"Usage: fgd_scan [host] [start port] [end port] <-v or -vv>\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
printf("argc %d argv[5] %s\n",argc,argv[5]);
|
||||||
|
verbose = 0;
|
||||||
|
switch (argc) {
|
||||||
|
/* case 5: base_port = (u_short)atoi(argv[2]);
|
||||||
|
end_port = (u_short)atoi(argv[3]);
|
||||||
|
verbose = 2;
|
||||||
|
src_host = argv[6];
|
||||||
|
break; */
|
||||||
|
case 5: if (!strcmp(argv[4],"-v"))
|
||||||
|
verbose = 1;
|
||||||
|
else if (!strcmp(argv[4],"-vv"))
|
||||||
|
verbose = 2;
|
||||||
|
else { fprintf(stderr,"Usage: fgd_scan [host] [start port] [end port] <-v or -vv>\n");
|
||||||
|
exit(1); }
|
||||||
|
|
||||||
|
case 4: base_port = (u_short)atoi(argv[2]);
|
||||||
|
end_port = (u_short)atoi(argv[3]);
|
||||||
|
break;
|
||||||
|
default: fprintf(stderr,"Usage: fgd_scan [host] [start port] [end port] <-v or -vv>\n");
|
||||||
|
exit(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bzero((char *)&address, sizeof(address));
|
||||||
|
address.sin_family = AF_INET;
|
||||||
|
/* determinating the source/sending host */
|
||||||
|
if (uname(&myname) == 0) src_host = myname.nodename;
|
||||||
|
printf("I'm running on HOST : %s\n", src_host);
|
||||||
|
/* resolving the destination host, here: fgd's host */
|
||||||
|
if (verbose == 2) printf("Resolving: %s ->",argv[1]);
|
||||||
|
if (host_info = gethostbyname(argv[1])) {
|
||||||
|
bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
|
||||||
|
if (verbose == 2) printf(" resolved\n");
|
||||||
|
} else if ((address.sin_addr.s_addr = inet_addr(argv[1])) == INADDR_NONE) {
|
||||||
|
fprintf(stderr,"Could not get %s host entry !\n",argv[1]);
|
||||||
|
printf(" NOT resolved !!!\n");
|
||||||
|
exit(1);
|
||||||
|
} else if (verbose == 2) printf(" address valid\n");
|
||||||
|
|
||||||
|
if ((base_port > end_port) || ((short)base_port < 0)) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
fgd_scan();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int fgd_len_msg = 1;
|
||||||
|
|
||||||
|
|
||||||
|
/******* HERE SCAN ROUTINE *******/
|
||||||
|
|
||||||
|
void fgd_scan() {
|
||||||
|
current_port = base_port;
|
||||||
|
printf("Scanning for fgd...\n");
|
||||||
|
while (current_port <= end_port) {
|
||||||
|
fprintf(stderr,"Trying port: %d\n",current_port);
|
||||||
|
sock = socket(PF_INET, SOCK_STREAM, 0);
|
||||||
|
if (sock == -1) {
|
||||||
|
fprintf(stderr, "Error assigning master socket: %s\n",sys_errlist[errno]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
address.sin_port = htons(current_port);
|
||||||
|
printf("address.sin_port : %d\n",htons(address.sin_port));
|
||||||
|
f_host_info = gethostbyname(src_host);
|
||||||
|
|
||||||
|
/* printf ("src_host : %s", ntohs(f_host_info->h_addr)); */
|
||||||
|
|
||||||
|
if (connect(sock, (struct sockaddr *)&address, sizeof(address)) == 0) {
|
||||||
|
|
||||||
|
/* we determine length of our ip */
|
||||||
|
fgd_len_msg = (int) sizeof(f_host_info->h_addr);
|
||||||
|
/* first we send length of ip */
|
||||||
|
write( sock, &fgd_len_msg,1);
|
||||||
|
/* then we send our ip */
|
||||||
|
write( sock, f_host_info->h_addr, fgd_len_msg);
|
||||||
|
/* we send the command, here 0 : we ask fgd to identify itself */
|
||||||
|
write( sock, "0", 1);
|
||||||
|
printf("verbose: %d", verbose);
|
||||||
|
|
||||||
|
printf(" Inquiring FGD to identify itself\n");
|
||||||
|
switch (verbose) {
|
||||||
|
case 0: printf("%d\n",current_port);
|
||||||
|
break;
|
||||||
|
case 1: service_info = getservbyport(htons(current_port),"tcp");
|
||||||
|
if (!service_info) {
|
||||||
|
printf("%d -> service name unknown\n",current_port);
|
||||||
|
} else {
|
||||||
|
printf("%d -> %s\n",current_port,service_info->s_name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2: service_info = getservbyport(htons(current_port),"tcp");
|
||||||
|
if (!service_info) {
|
||||||
|
read( sock, &buff, 3);
|
||||||
|
printf(" Got reply : %s\n", &buff);
|
||||||
|
if (strncmp(&buff, "FGD", 3) == 0) {
|
||||||
|
printf(" FlightGear-Deamon detected\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("Port %d found. Service name unknown\n",current_port);
|
||||||
|
} else {
|
||||||
|
printf("Port %d found. Service name: %s\n",current_port,service_info->s_name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (errno == 113) {
|
||||||
|
fprintf(stderr,"No route to host !\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* fprintf(stderr,"Error %d connecting socket %d to port %d: %s\n",
|
||||||
|
errno,sock,current_port,sys_errlist[errno]); */
|
||||||
|
close(sock);
|
||||||
|
current_port++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose == 2) printf("FGD scan finished !\n");
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue