1 /*************************************************************/
2 /* FGD.C 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 a standalone Tool to communicate with any */
15 /* FlightGear System and FGFS-Deamon. */
16 /* This is Open Source Software with some 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 08 1999 */
30 /* v0.1-beta : Jan 16 2000 */
31 /* libc5, glibc-2.0, 2.1 cleanups */
32 /*************************************************************/
36 #include <sys/socket.h>
37 #include <sys/types.h>
38 #include <netinet/in.h>
43 #include <sys/utsname.h>
49 int maxfd, nready, retval;
51 struct utsname myname;
52 char *fgd_host, *src_host;
55 int verbose, fgd_len_msg;
57 /* List-stuff (doubly-Linked-list) */
61 int i, j, fgd_cnt, fgd_curpos;
66 float sgFGD_COORD[4][4];
69 unsigned char ipadr[16], callsign[16];
70 unsigned char lat[8], lon[8], alt[8], speed[8], roll[8], pitch[8], yaw[8];
71 float latf, lonf, altf, speedf, rollf, pitchf, yawf;
72 float sgFGD_COORD[4][4];
73 struct list_ele *next, *prev;
76 struct list_ele *head, *tail, *act, *test, *incoming; /* fgd_msg; */
78 struct fgd_sock_list {
83 struct fgd_sock_list fgd_cli_list[255];
84 int fgd_known_cli = -1; /* False */
87 /*...Create head and tail of list */
88 void list_init( void) {
89 incoming = (struct list_ele*) malloc(sizeof(struct list_ele));
90 head = (struct list_ele*) malloc(sizeof(struct list_ele));
91 tail = (struct list_ele*) malloc(sizeof(struct list_ele));
92 if (head == NULL || tail == NULL) { printf("Out of memory\n"); exit(1); }
93 /* fixme :Where is the "with foobar do command "
94 head->ipadr = "127.0.0.0";
95 strcpy(head->callsign, "None");
103 /* yaw!. Who the f$%& invented this ;-) */
105 tail->ipadr[0] = 255;
107 head->prev = tail->prev = head;
108 head->next = tail->next = tail;
109 act = head; /* put listpointer to beginning of list */
112 void list_output( void) {
115 void list_search( char name[16]) {
117 if (strcmp(name, head->next->ipadr) <= 0) act = head;
118 else if (strcmp(name, tail->prev->ipadr) > 0) act = tail->prev;
120 int vergleich = strcmp(name, act->ipadr);
122 while (strcmp(name, act->next->ipadr) > 0) {
125 else if (vergleich < 0)
126 while (strcmp(name, act->ipadr) < 0) {
130 while (strcmp(name, act->ipadr) == 0) {
136 void list_insert( char newip[16]) {
137 struct list_ele *new_ele;
139 new_ele = (struct list_ele*) malloc(sizeof(struct list_ele));
140 if (new_ele == NULL) { printf("Out of memory\n"); exit(1); }
141 strcpy(new_ele->ipadr, newip);
142 /* setting default */
143 strcpy(new_ele->callsign, "not assigned");
146 new_ele->next = act->next;
147 act->next->prev = act->next = new_ele;
150 void list_setval( char newip[16]) {
153 strcpy( act->next->callsign, incoming->callsign);
154 act->next->latf = incoming->latf;
155 act->next->lonf = incoming->lonf;
156 act->next->altf = incoming->altf;
157 act->next->speedf = incoming->speedf;
158 act->next->rollf = incoming->rollf;
159 act->next->pitchf = incoming->pitchf;
160 act->next->yawf = incoming->yawf;
161 printf("Callsign %s ", act->next->callsign);
162 printf(" lat: %7.3f lon: %7.3f alt: %7.3f speed: %7.3f roll: %7.3f pitch: %7.3f yaw: %7.3f",
163 act->next->latf, act->next->lonf, act->next->altf, act->next->speedf,
164 act->next->rollf, act->next->pitchf, act->next->yawf);
167 void list_setval_Mat4( char newip[16]) {
170 strcpy( act->next->callsign, incoming->callsign);
173 act->next->sgFGD_COORD[i][j] = incoming->sgFGD_COORD[i][j];
174 printf("Callsign %s ", act->next->callsign);
178 void list_clear( char clrip[16]) {
179 struct list_ele *clr_ele;
182 if ( strcmp( clrip, act->next->ipadr))
183 printf("....Name %s nicht vorhanden", clrip);
186 act->next = act->next->next;
187 act->next->prev = act;
193 int list_not_in( char name[16]) {
197 while ((test != tail) && (i==True)) {
198 i = (strcmp(test->ipadr, name) ? True : False);
200 if (verbose != 0) printf("list_not_in : %d\n",i);
215 struct { char *adr, *lon, *lat, *alt;} fgd_client;
218 struct sockaddr_in address;
219 struct sockaddr_in my_address;
223 int current_port = 0;
224 u_short base_port = 0;
225 u_short end_port = 1024;
226 struct hostent *host_info;
227 struct servent *service_info;
231 int main(int argc, char **argv)
234 fprintf(stderr,"Usage: fgd [start port] [end port] [name] <-v or -vv>\n");
239 case 5: if (!strcmp(argv[4],"-v"))
241 else if (!strcmp(argv[4],"-vv"))
243 else { fprintf(stderr,"Usage: fgd [start port] [end port] [name] <-v or -vv>\n");
246 case 4: base_port = (u_short)atoi(argv[1]);
247 end_port = (u_short)atoi(argv[2]);
250 default: fprintf(stderr,"Usage: fgd [start port] [end port] [name] <-v or -vv>\n");
255 bzero((char *)&address, sizeof(address));
256 address.sin_family = AF_INET;
257 if (uname(&myname) == 0) fgd_host = myname.nodename;
258 printf(" I am running as %s on HOST %s\n", fgd_name, fgd_host);
260 if (verbose == 2) printf(" Resolving: %s ->",fgd_host);
261 if (host_info = gethostbyname(fgd_host)) {
262 bcopy(host_info->h_addr, (char *)&address.sin_addr,host_info->h_length);
263 printf(" fgd : ip = %s\n", inet_ntoa( address.sin_addr));
265 if (verbose == 2) printf(" resolved\n");
266 } else if ((address.sin_addr.s_addr = inet_addr(fgd_host)) == INADDR_NONE) {
267 fprintf(stderr,"Could not get %s host entry !\n",argv[1]);
268 printf(" NOT resolved !!!\n");
270 } else if (verbose == 2) printf(" address valid\n");
272 if ((base_port > end_port) || ((short)base_port < 0)) {
273 fprintf(stderr,"Bad port range : start=%d end=%d !\n");
275 } else if (verbose == 2) {
276 printf(" Port range: %d to %d\n",base_port,end_port);
278 printf(" verbose: %d\n",verbose);
279 /* some init stuff */
280 fgd_txt = (char *) malloc(1024);
286 void fgd_init(void) {
288 struct { char *ip, *lon, *lat, *alt;} fg_id;
291 current_port = base_port;
292 while (current_port <= end_port) {
293 sock = socket(PF_INET, SOCK_STREAM, 0);
296 fprintf(stderr, "Error assigning master socket: %s\n",sys_errlist[errno]);
300 address.sin_port = htons(current_port);
301 if (verbose == 2) printf(" address.sin_port : %d\n",htons(address.sin_port));
303 if ( bind(sock, (struct sockaddr *)&address, sizeof(address)) == -1) {
304 printf(" Aiiiieeehh...ADRESS ALSO IN USE...\7hmmm...please check another port\n");
305 printf(" Just wait a few seconds or do a netstat to see the port status.\n");
313 FD_SET( sock, &allset);
318 nready = select( sock + 1, &rset, NULL, NULL, &tv);
319 if (FD_ISSET( sock, &rset)) {
320 my_sock = accept( sock, (struct sockaddr *)&address, (int*) sizeof(address));
322 /* reading length of senders' ip */
324 read( my_sock, buff, 1);
325 fgd_ele_len = buff[0];
326 if (verbose == 2) printf("ele_len %d\n", fgd_ele_len);
327 /* reading senders' ip */
328 read( my_sock, &buff, fgd_ele_len);
330 // printf("%d %d %d %d %x %x %x\n", buff[0], buff[1], buff[2], buff[3], &ip, ip, *ip);
331 fgd_client.adr = (char*) inet_ntoa( *ip);
332 src_host = fgd_client.adr;
333 /* reading commando */
334 read( my_sock, &buff, 1);
335 /* closing previous file descriptor of same client, at least we know now
336 that the previous command is finished since it's the same client who
337 again requests something. Maybe I'm to quick and diiirty ;-) */
338 printf("FGD : Using socket #%d\n", my_sock);
339 fgd_known_cli = False;
340 for ( fgd_cnt = 1; fgd_cnt < fgd_cli+1; fgd_cnt++) {
341 printf("FGD : fgd_cnt:%d fgd_cli:%d fgd_client.adr: %s prev.sock:%d fgd_cli_list[fgd_cnt].adr: %s\n",
342 fgd_cnt, fgd_cli, fgd_client.adr,
343 fgd_cli_list[fgd_cnt].prev_sock, fgd_cli_list[fgd_cnt].adr);
344 if ( strcmp( fgd_cli_list[fgd_cnt].adr, fgd_client.adr) == 0) {
345 printf("FGD : In Vergleichsloop. Closing socket: %d\n",
346 fgd_cli_list[fgd_cnt].prev_sock);
347 close( fgd_cli_list[fgd_cnt].prev_sock);
348 fgd_cli_list[fgd_cnt].prev_sock = my_sock;
349 fgd_known_cli = True;
352 if ( fgd_known_cli == False) {
354 fgd_cli_list[fgd_cli].prev_sock = my_sock;
355 strcpy(fgd_cli_list[fgd_cli].adr, fgd_client.adr);
357 printf(" Commando received : %s from Host : %s\n", &buff, src_host);
358 fgd_com = ( (char) buff[0]) - 0x30;
359 printf("%d \n", fgd_com);
361 case 0: printf(" fgd : Identify\n");
362 sprintf( (char*) buff, "FGDLH%s", fgd_name);
363 buff[3] = strlen(fgd_name) + 1; /* Lo, incl.zero */
364 buff[4] = 0; /* Hi, names < 0xff ! */
365 buff[buff[3] + 4] = 0; /* Term.zero */
366 printf(" I am : %s\n", fgd_name);
367 write( my_sock, &buff, buff[3]+5); /* fgd housekeeping ;-) */
370 case 1: printf(" fgd : Register\n");
371 /* reading length of FGFS_host ip */
373 read( my_sock, &buff, 1);
374 fgd_ele_len = (int) &buff;
375 /* reading FGFS_host ip */
376 read( my_sock, &buff, fgd_ele_len);
378 fgd_client.adr = (char*) inet_ntoa( *ip);
379 if (list_not_in(fgd_client.adr) == True) {
380 list_insert(fgd_client.adr);
381 list_search(fgd_client.adr);
382 // strcpy(act->callsign, "None");
383 printf(" Setting default values\n");
384 printf(" IP : %s\n", act->next->ipadr);
385 printf(" PILOT : %s\n", act->next->callsign);
387 /* writing answer back to client */
388 sprintf( (char*) buff, "FGDLH%s", fgd_client.adr);
389 buff[3] = strlen(fgd_client.adr) + 1; /* Lo, incl.zero */
390 buff[4] = 0; /* Hi, names < 0xff ! */
391 buff[buff[3] + 4] = 0; /* Term.zero */
392 write( my_sock, &buff, buff[3]+5); /* fgd housekeeping ;-) */
395 case 2: printf(" fgd : Show Registered\n");
396 sprintf( (char*) buff, "FGD");
397 // buff[3] = buff[4] = 0;
401 while (test != tail) {
402 printf(" IP : %s\n", test->ipadr);
404 fgd_ele_len = strlen(test->ipadr) + 1;
405 // printf(" ele_len %d curpos %d\n", fgd_ele_len, fgd_curpos);
406 buff[fgd_curpos] = fgd_ele_len;
408 bcopy(test->ipadr, &buff[fgd_curpos], fgd_ele_len);
409 fgd_curpos += fgd_ele_len;
410 //buff[fgd_curpos] = 0;
413 if (fgd_cnt == 0) fgd_curpos--;
414 buff[3] = fgd_curpos & 0xff;
415 buff[4] = fgd_curpos >> 8;
417 write( my_sock, &buff, fgd_curpos);
420 case 3: printf(" fgd : Send MSG\n");
423 case 4: printf(" fgd : Send MSG to all\n");
426 case 5: printf(" fgd : Get DATA from client\n");
427 read( my_sock, &buff, 1);
428 fgd_ele_len = buff[0];
429 read( my_sock, &buff, fgd_ele_len);
431 fgd_client.adr = (char*) inet_ntoa( *ip);
432 printf(" IP : %s\n", fgd_client.adr);
433 if (verbose != 0) printf("not_in (CASE) : %d\n", list_not_in(fgd_client.adr));
434 if (list_not_in(fgd_client.adr) == False) {
435 printf(" Checkpoint\n");
436 read( my_sock, &buff, 1);
437 printf(" Checkpoint 1\n");
438 fgd_ele_len = buff[0];
439 read( my_sock, &buff, fgd_ele_len);
440 incoming->callsign[fgd_ele_len] = 0;
441 bcopy( &buff, incoming->callsign, fgd_ele_len);
443 read( my_sock, &buff, 56);
444 sscanf( buff," %7f %7f %7f %7f %7f %7f %7f", &incoming->latf, &incoming->lonf,
445 &incoming->altf, &incoming->speedf, &incoming->rollf,
446 &incoming->pitchf, &incoming->yawf);
447 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",
448 incoming->latf, incoming->lonf, incoming->altf, incoming->speedf,
449 incoming->rollf, incoming->pitchf, incoming->yawf);
450 list_setval(fgd_client.adr);
452 else strcpy( fgd_client.adr, "UNKNOWN");
453 /* writing answer back to client */
454 sprintf( (char*) buff, "%sLH%s ", "FGD", fgd_client.adr);
455 buff[3] = strlen(fgd_client.adr) + 1;
457 buff[ buff[3] + 4] = 0;
458 printf(" IP : %s\n", fgd_client.adr);
459 write( my_sock, &buff, buff[3]+5);
462 case 17: printf(" fgd : Get Mat4 DATA from client\n");
463 read( my_sock, &buff, 1);
464 fgd_ele_len = buff[0];
465 read( my_sock, &buff, fgd_ele_len);
467 fgd_client.adr = (char*) inet_ntoa( *ip);
468 printf(" IP : %s\n", fgd_client.adr);
469 if (verbose != 0) printf("not_in (CASE) : %d\n", list_not_in(fgd_client.adr));
470 if (list_not_in(fgd_client.adr) == False) {
471 printf(" Checkpoint\n");
472 read( my_sock, &buff, 1);
473 printf(" Checkpoint 1\n");
474 fgd_ele_len = buff[0];
475 read( my_sock, &buff, fgd_ele_len);
476 incoming->callsign[fgd_ele_len] = 0;
477 bcopy( &buff, incoming->callsign, fgd_ele_len);
479 read( my_sock, &buff, 158);
480 i = sscanf( buff," %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
481 &incoming->sgFGD_COORD[0][0], &incoming->sgFGD_COORD[0][1], &incoming->sgFGD_COORD[0][2], &incoming->sgFGD_COORD[0][3],
482 &incoming->sgFGD_COORD[1][0], &incoming->sgFGD_COORD[1][1], &incoming->sgFGD_COORD[1][2], &incoming->sgFGD_COORD[1][3],
483 &incoming->sgFGD_COORD[2][0], &incoming->sgFGD_COORD[2][1], &incoming->sgFGD_COORD[2][2], &incoming->sgFGD_COORD[2][3],
484 &incoming->sgFGD_COORD[3][0], &incoming->sgFGD_COORD[3][1], &incoming->sgFGD_COORD[3][2], &incoming->sgFGD_COORD[3][3]);
486 // printf(" sscanf input: %d\n",i);
487 printf(" sgMat4: \n%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n",
488 incoming->sgFGD_COORD[0][0], incoming->sgFGD_COORD[0][1], incoming->sgFGD_COORD[0][2], incoming->sgFGD_COORD[0][3],
489 incoming->sgFGD_COORD[1][0], incoming->sgFGD_COORD[1][1], incoming->sgFGD_COORD[1][2], incoming->sgFGD_COORD[1][3],
490 incoming->sgFGD_COORD[2][0], incoming->sgFGD_COORD[2][1], incoming->sgFGD_COORD[2][2], incoming->sgFGD_COORD[2][3],
491 incoming->sgFGD_COORD[3][0], incoming->sgFGD_COORD[3][1], incoming->sgFGD_COORD[3][2], incoming->sgFGD_COORD[3][3]);
492 list_setval_Mat4(fgd_client.adr);
494 else strcpy( fgd_client.adr, "UNKNOWN");
495 /* writing answer back to client */
496 sprintf( (char*) buff, "FGDLH%s", fgd_client.adr);
497 buff[3] = strlen(fgd_client.adr) + 1;
498 buff[4] = buff[buff[3]+5] = 0;
499 printf(" IP : %s\n", fgd_client.adr);
500 write( my_sock, &buff, buff[3]+5);
503 case 6: printf(" fgd : Send all DATA to client\n");
504 sprintf( (char*) buff, "%s %s", "FGD", fgd_client.adr);
509 while (test != tail) {
510 printf(" IP : %-16s Callsign : %-16s\n", test->ipadr, test->callsign);
513 fgd_ele_len = strlen(test->ipadr);
514 printf(" ele_len %d curpos %d\n", fgd_ele_len, fgd_curpos);
515 buff[fgd_curpos] = fgd_ele_len;
517 bcopy(test->ipadr, &buff[fgd_curpos], fgd_ele_len);
518 fgd_curpos = fgd_curpos + fgd_ele_len;
520 fgd_ele_len = strlen(test->callsign);
521 printf(" ele_len %d curpos %d\n", fgd_ele_len, fgd_curpos);
522 buff[fgd_curpos] = fgd_ele_len;
524 bcopy(test->callsign, &buff[fgd_curpos], fgd_ele_len);
525 fgd_curpos = fgd_curpos + fgd_ele_len;
526 /* Lat, Lon, Alt, Speed, Roll, Pitch, Yaw
527 hope this sprintf call is not too expensive */
528 sprintf( fgd_txt, " %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f",
529 test->latf, test->lonf, test->altf, test->speedf,
530 test->rollf, test->pitchf, test->yawf);
531 printf(" ele_len %d curpos %d\n", fgd_ele_len, fgd_curpos);
532 printf(" Data : %s\n", fgd_txt);
533 bcopy((char *) fgd_txt, &buff[fgd_curpos], 56);
537 if (fgd_cnt == 0) fgd_curpos --;
538 printf(" ele_len %d curpos %d\n", fgd_ele_len, fgd_curpos);
539 buff[3] = fgd_curpos;
540 buff[4] = fgd_curpos / 256;
542 write( my_sock, &buff, fgd_curpos);
545 case 18: printf(" fgd : Send all Mat4 DATA to client\n");
546 sprintf( (char*) buff, "FGDLH");
547 buff[3] = buff[4] = 0;
551 while (test != tail) {
552 printf(" IP : %-16s Callsign : %-16s\n", test->ipadr, test->callsign);
555 fgd_ele_len = strlen(test->ipadr);
556 printf(" ele_len %d curpos %d\n", fgd_ele_len, fgd_curpos);
557 buff[fgd_curpos] = fgd_ele_len;
559 bcopy(test->ipadr, &buff[fgd_curpos], fgd_ele_len);
560 fgd_curpos = fgd_curpos + fgd_ele_len;
562 fgd_ele_len = strlen(test->callsign);
563 printf(" ele_len %d curpos %d\n", fgd_ele_len, fgd_curpos);
564 buff[fgd_curpos] = fgd_ele_len;
566 bcopy(test->callsign, &buff[fgd_curpos], fgd_ele_len);
567 fgd_curpos = fgd_curpos + fgd_ele_len;
568 /* Lat, Lon, Alt, Speed, Roll, Pitch, Yaw
569 hope this sprintf call is not too expensive */
570 fgd_len_msg = sprintf( fgd_txt, " %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
571 test->sgFGD_COORD[0][0], test->sgFGD_COORD[0][1], test->sgFGD_COORD[0][2], test->sgFGD_COORD[0][3],
572 test->sgFGD_COORD[1][0], test->sgFGD_COORD[1][1], test->sgFGD_COORD[1][2], test->sgFGD_COORD[1][3],
573 test->sgFGD_COORD[2][0], test->sgFGD_COORD[2][1], test->sgFGD_COORD[2][2], test->sgFGD_COORD[2][3],
574 test->sgFGD_COORD[3][0], test->sgFGD_COORD[3][1], test->sgFGD_COORD[3][2], test->sgFGD_COORD[3][3]);
575 fgd_txt[fgd_len_msg] = 0;
576 printf(" ele_len %d curpos %d\n", fgd_ele_len, fgd_curpos);
577 printf(" Data : %s\n", fgd_txt);
578 bcopy((char *) fgd_txt, &buff[fgd_curpos], fgd_len_msg+1);
579 fgd_curpos += fgd_len_msg+1;
582 if (fgd_cnt == 0) fgd_curpos -= 1;
583 printf(" ele_len %d curpos %d\n", fgd_ele_len, fgd_curpos);
584 buff[3] = fgd_curpos & 0xff;
585 buff[4] = fgd_curpos / 256;
587 printf("ANZ: %d CURPOS: %d\n", (unsigned char) buff[3] + (unsigned char) buff[4] * 256, fgd_curpos);
588 write( my_sock, &buff, fgd_curpos);
591 case 8: printf(" fgd : Unregister\n");
592 read( my_sock, &buff, 1);
593 fgd_ele_len = (int) &buff;
594 read( my_sock, &buff, fgd_ele_len);
596 fgd_client.adr = (char*) inet_ntoa( *ip);
597 printf(" IP : %s\n", fgd_client.adr);
598 if (verbose != 0) printf("not_in (CASE) : %d\n", list_not_in(fgd_client.adr));
599 if (list_not_in(fgd_client.adr) == -1) {
600 list_clear(fgd_client.adr);
602 else strcpy( fgd_client.adr, "UNKNOWN");
603 /* writing answer back to client */
604 sprintf( (char*) buff, "FGDLH%s", fgd_client.adr);
605 buff[3] = strlen(fgd_client.adr) + 1;
606 buff[4] = buff[buff[3]+5] = 0;
607 printf(" IP : %s\n", fgd_client.adr);
608 write( my_sock, &buff, buff[3]+5);
609 // Just leaving the old stuff in, to correct it for FGFS later...
610 // I'm sick of this f$%&ing libc5/glibc2.0/2.1 quirks
611 // Oliver...very angry...
612 // /* writing answer back to client */
613 // sprintf( (char*) buff, "%s %s", "FGD", fgd_client.adr);
614 // buff[3] = strlen(fgd_client.adr);
615 // printf(" IP : %s\n", fgd_client.adr);
616 // write( my_sock, &buff, buff[3]+4);
619 case 9: printf(" fgd : Shutdown\n");
623 default: printf(" fgd : Huh?...Unknown Command\n");
630 case 0: printf("%d\n",base_port+current_port);
632 case 1: service_info = getservbyport(htons(base_port+current_port),"tcp");
634 printf("%d -> service name unknown\n",base_port+current_port);
636 printf("%d -> %s\n",base_port+current_port,service_info->s_name);
639 case 2: service_info = getservbyport(htons(base_port+current_port),"tcp");
641 printf("Port %d found. Service name unknown\n",base_port+current_port);
643 printf("Port %d found. Service name: %s\n",base_port+current_port,service_info->s_name);
648 } else if (errno == 113) {
649 fprintf(stderr,"No route to host !\n");
652 /* current_port++; */
655 if (verbose == 2) printf("Port scan finished !\n");