/******************************************** * 6scaner.c * Copyright (C) 2001 Robert M. Nowotniak * nie 9 gru 2001 14:37:58 CET * * Prosty skaner, do prostego skanowania adresów IPv6 (_tylko_ IPv6) * na wybranych portach. Kompilacja: * cc 6scaner.c -O -o 6scaner -Wall * * Oczekiwany format pliku wejściowego (INFILE): adresy IPv6 w dowolnym, * prawidłowym dla IPv6 formacie - jeden pod drugim. * */ #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_PORTOW 10 #define SECONDS 3 // Ile sekund do timeout'u #define INFILE "INPUT" #define OUTFILE "OUTPUT" int wez_wpis(FILE*,char*); int skanuj(char*,short*); void timeout(int); void flushuj(FILE*); // Które porty skanować ? short porty[MAX_PORTOW]={21,80}; short fd; int main(){ FILE *wejscie,*wyjscie; char adres[40],tn=0; struct stat junk; short otwarte[MAX_PORTOW]; int n; if(!(stat(OUTFILE,&junk))){ while(tn!='t' && tn!='T' && tn!='n' && tn!='N'){ printf("%s istnieje, usunąć? [t/n] ",OUTFILE); tn=getchar(); flushuj(stdin); switch (tn){ case 't': case 'T': if(unlink(OUTFILE)){ printf("Nie można było usunąć %s\n",OUTFILE); perror("Błąd"); exit(1); } printf("Usunięto %s\n",OUTFILE); break; case 'n': case 'N': exit(1); break; } } } printf("Próba otwarcia pliku %s do odczytu i %s do zapisu...\n",INFILE,OUTFILE); if(!(wejscie=fopen(INFILE,"r")) || !(wyjscie=fopen(OUTFILE,"w")) ){ perror("Błąd"); exit(1); } signal(SIGALRM,timeout); while(!wez_wpis(wejscie,adres)){ bzero(otwarte,MAX_PORTOW); if(!(skanuj(adres,otwarte))){ fprintf(wyjscie,"%s\t",adres); for(n=0;otwarte[n] && nsin6_family=AF_INET6; printf("Skanowanie %s\n",adres); for(n=0;porty[n] && nsin6_addr))<0){ puts("AF_INET6 nie wydaje się być poprawną rodziną gniazd. (?)"); close(fd); ret=1; break; }else if(!wynik){ printf("Adres %s nie wydaje się być poprawnym adresem IPv6.\n",adres); close(fd); ret=1; break; } serv_addr->sin6_port=htons(porty[n]); printf("Port %d... \t",porty[n]); alarm(SECONDS); if(connect(fd,(struct sockaddr*)serv_addr,sizeof(struct sockaddr_in6))){ if(errno==EBADF){ puts("timeout."); continue; } printf("failed.\n"); printf(" %s\n",strerror(errno)); close(fd); continue; } alarm(0); // Jest otwarty port puts("OK!"); zapis[m++]=porty[n]; ret=0; close(fd); } printf("\n"); free((void*)serv_addr); return ret; } void timeout(int junk){ close(fd); } void flushuj(FILE* co){ char znak; do znak=getc(co); while(znak!='\n' && znak!=EOF); }