/* May 1996 Port redirector Author: Sergey V Smirnov 17 may 1996. Port to Solaris 2.4. Maksim Moshkow ÏÅÐÅÍÀÇÍÀ×ÀÅÒ ÂÂÎÄ/ÂÛÂÎÄ ÍÀ ÇÀÄÀÍÍÛÉ ÏÎÐÒ ÇÀÄÀÍÍÎÃÎ ÕÎÑÒÀ È ÍÀ ËÅÒÓ ÏÅÐÅÊÎÄÈÐÓÅÒ ÏÐÎÕÎÄßÙÈÉ ÏÎÒÎÊ - ÒÓÄÀ - ÈÇ koi  win ÎÁÐÀÒÍÎ - ÈÇ win  koi (ÈËÈ ÀËÜÒÅÐÍÀÒÈÂÊÈ) êÎÌÏÈËßÖÈß ÄËß Solaris 2.* gcc -O2 -o /usr/local/bin/redirector redirect1.c -lnsl -lsocket Usage: redirector host port {alt|win} [ timeout ] [ -S script ] ÂÈÄ ÏÅÐÅÊÎÄÈÐÎÂÊÈ alt ÈËÈ win -S ÑÊÐÈÏÒ Â ÔÎÐÌÅ: "îÆÈÄÀÅÌÀß_ÑÒÐÎÊÀ" "ÏÎÑÛËÀÅÌÀß_ÑÒÐÎÊÀ" ... ÇÀÑÛËÀÅÒÑß Â ÏÎÐÒ ÄÎ ÍÀ×ÀËÀ ÏÅÐÅÊÎÄÈÐÎÂÊÈ óÑÒÀÍÀÂËÈÂÀÅÒÑß ÏÐÎÃÐÀÌÌÀ ×ÅÐÅÇ inetd - ÊÎÒÎÐÛÉ ÑÀÌ ÏÅÐÅÍÀÇÍÀ×ÀÅÒ stdin/stdout ÐÅÄÈÐÅÊÒÎÐÀ ÍÀ ÏÎÐÒ, ÏÎ ÊÎÒÎÐÎÌÓ Ê ÍÅÌÓ ÑÎÅÄÈÍßÅÒÑß ÊËÈÅÍÒ. ïÐÎÃÐÀÌÌÊÓ ÌÎÆÍÎ ÒÀÊ ÆÅ ÈÑÏÎËÜÇÎÂÀÒÜ ÊÀÊ "ÐÛÁÓ" ÄËß standalone ÄÅÌÎÍÀ proxy-ÏÅÐÅÊÎÄÈÐÎÂÙÈÊÀ (ÎÑÒÀËÎÑÜ ÄÎÏÈÑÀÒÜ ÊÓÑÎÊ, ÊÎÒÎÐÛÉ ÂÌÅÑÒÎ stdin/stdout ÁÐÀË ÁÛ tcp/ip ÑÎÅÄÈÍÅÍÈÅ ×ÅÐÅÇ ÇÀÄÀÍÍÛÉ ÏÎÐÒ îÑÍÎÂÍÀß ÖÅËÜ - ÑÄÅËÀÒÜ ÏÅÐÅÊÎÄÈÐÎÂÊÓ ÄËß MS Windows Netscape- Mail, Ñ ÏÅÐÅÊÎÄÈÐÎÂÊÎÉ win<->koi8. òÀÊ ÆÅ ÐÅÄÈÐÅÊÒÎÐ ÌÎÆÅÒ ÏÅÐÅÊÎÄÈÐÎÂÀÒÜ íÜÞÑÛ È WWW ÑÒÐÀÍÈÖÛ ÄËß âÈÍÄÞÊÎÂÛÉÕ ÊËÈÅÍÒÎÂ. îÑÒÀÅÒÑß ÃÐÀÌÎÒÍÎ ÎÁÐÀÁÎÒÀÒÜ ÇÀÊÐÛÒÈÅ ÑÎÅÄÈÍÅÍÈÉ, ÈÁÎ ÐÅÄÈÐÅÊÒÎÐÛ ÏÅÐÈÎÄÈ×ÅÑÊÈ ÇÀÂÈÑÀÞÒ Â ÇÎÌÁÈÔÈÖÈÐÎÂÀÍÍÎÌ ÑÎÑÒÎßÍÈÈ, È ÁËÎÊÈÐÓÞÒ ÏÐÈÅÌ ÑÂÅÆÅÉ ÏÎ×ÒÛ Â netscape-mail =========================================================================== 0. â Netscape-Mail ÏÎÐÒ ÑÅÐÂÅÐÀ ÏÅÐÅÍÀÇÍÀ×ÀÅÒÑß ÒÀÊ: Options-> Mail and News Preferences-> Server-> Mail server mailhost:2025 Options-> Mail and News Preferences-> Server-> Pop3 server pop3host:2110 èËÈ ÏÐßÌÎ Â ÔÀÉËÅ preference: MAILHOST: smtphost:2025 POP3_HOST: pop3host:2110 # ïÐÈÌÅ×ÀÍÈÅ: ÂÈÄÈÌÎ ÂÀÌ ÇÀÕÎ×ÅÒÑß ÍÀÏÈÑÀÒÜ ÑÈÌÂÎËÈ×ÅÑÊÈÅ ÈÌÅÍÀ ÏÎÐÒΠ- ÒÈÏÀ # # MAILHOST: smtphost:smtpwin # POP3_HOST: pop3host:pop3win # # ïÎÏÐÎÁÓÉÒÅ, ÌÎÆÅÒ ÁÛÒÜ ÂÀÌ ÏÎÂÅÇÅÒ. íÎ Ó ÌÅÍß # Netscape ÐÀÑÏÎÇÍÀË ÒÎËÜÊÎ ÖÈÔÐÎÂÛÅ ÇÍÀ×ÅÍÈß ÏÎÐÒΠóñòàíîâêà ðåäèðåêòîðà íà Unix host'Å 1. â ÔÀÉË � /etc/services ÂÏÈÑÀÒÜ ÑÒÐÎ×ÊÈ pop3win 2110/tcp # Perekodirowsik porta pop3 smtpwin 2025/tcp # Perekodirowsik porta smtp nntpwin 2119/tcp # Perekodirowsik porta nntp httpwin 2080/tcp # Perekodirowsik porta http pop3alt 3110/tcp # Perekodirowsik porta pop3 smtpalt 3025/tcp # Perekodirowsik porta smtp nntpalt 3119/tcp # Perekodirowsik porta nntp httpalt 3080/tcp # Perekodirowsik porta http 2. â ÔÀÉË � /etc/inetd.conf ÂÏÈÑÀÒÜ ÑÒÐÎ×ÊÈ smtpwin stream tcp nowait nobody /usr/local/bin/redirector redirector localhost smtp win 40 pop3win stream tcp nowait nobody /usr/local/bin/redirector redirector localhost pop3 win 40 nntpwin stream tcp nowait nobody /usr/local/bin/redirector redirector localhost nntp win 100 httpwin stream tcp nowait nobody /usr/local/bin/redirector redirector localhost 80 win 3600 smtpalt stream tcp nowait nobody /usr/local/bin/redirector redirector localhost smtp alt 40 pop3alt stream tcp nowait nobody /usr/local/bin/redirector redirector localhost pop3 alt 40 nntpalt stream tcp nowait nobody /usr/local/bin/redirector redirector localhost nntp alt 100 httpalt stream tcp nowait nobody /usr/local/bin/redirector redirector localhost 80 alt 3600 */ #include #include #include #include #include #include #include #include #include #include #define BUFLEN 1024 #define USSAGE "redirect host port {alt|win} [ timeout ] [ -S script ] \n" #define ALT 1 #define WIN 2 int ppid, pid; int tcp_conn (host_name, port_name) char *host_name; char *port_name; { int fd; struct sockaddr_in port; struct hostent *h; struct servent *serv; ushort port_number; port.sin_family = AF_INET; if (*host_name>='0' && *host_name<='9') { port.sin_addr.s_addr = inet_addr(host_name); } else { h = gethostbyname(host_name); if (!h) { printf("%s: unknown host\n", host_name); return -1; } port.sin_addr = *((struct in_addr *) h->h_addr); } if (*port_name>='0' && *port_name<='9') port.sin_port=htons (atoi(port_name)); else { serv=getservbyname(port_name,(char*)0); if (serv) port.sin_port=serv->s_port; else { printf ("unknown service"); return -1; } } fd = socket (AF_INET, SOCK_STREAM, 0); if (fd < 0) return -1; if (connect (fd, (struct sockaddr *) &port, sizeof port) < 0) return -1; return fd; } void sig_kill() { kill(ppid, SIGTERM); exit(0); } void sig_alrm() { termin(); } void sig_alrm1() { exit(0); } extern char *optarg; main (argc,argv) char *argv[]; int argc; { int fd, i,j,br,bw,bread; fd_set rready,wready,rt,wt; struct timeval tv; char ch; char *arg,*cp; FILE *ni,*no; char buf[256]; unsigned char netbuf[BUFLEN]; int option, timeout = 0; static char host[200]; static char port[100]; int convert = 0, nparm = 1, script = 0; /* while ((option = getopt( argc, argv, "h:p:t:Sc:?Hh")) != EOF) { switch ( option ) { case 'h': strcpy(host, optarg); nparm+=2; break; case 'p': strcpy(port, optarg); nparm+=2; break; case 'c' : if (strcasecmp("alt", optarg)==0) convert = ALT; if (strcasecmp("win", optarg) == 0) convert = WIN; nparm+=2; break; case 't': timeout = atoi(optarg); nparm+=2; break; case 'S': script = 1; nparm++; break; default: fprintf(stderr, "%s\n", USSAGE); exit(0); } } */ /* inetd ÏÅÐÅÄÀÅÒ ÂÛÇÛÂÀÅÌÎÉ ÏÐÎÃÐÀÌÌÅ ÍÅ ÁÎËÅÅ 4 ÏÀÐÀÌÅÒÐÎÂ. ïÐÈÕÎÄÈÒÑß ÝÊÎÍÎÌÈÒÜ ÍÀ ÔËÀÃÀÕ */ if (argc<4) {fprintf(stderr, "%s\n", USSAGE); exit (1);} i=1; strcpy(host, argv[i]); i++; strcpy(port, argv[i]); i++; convert=0; if (strcasecmp("alt", argv[i]) == 0) convert = ALT; if (strcasecmp("win", argv[i]) == 0) convert = WIN; i++; if (argc>4) { timeout = atoi(argv[i]); i++; } printf ("host %s, port %s, kod %d, timeout %d", host, port, convert, timeout); ppid = getpid(); signal(SIGTERM, ( void (*)())sig_kill); signal(SIGHUP, ( void (*)())sig_kill); signal(SIGQUIT, ( void (*)())sig_kill); signal(SIGINT, ( void (*)())sig_kill); if ((fd=tcp_conn(host, port))==-1) { perror ("Can't connect"); exit(-1) ; } if (script == 1) { for (i=nparm;i=0) { printf ("Got:%s\n",buf); fflush (stdout); if ((cp=strstr(buf,argv[i]))!=NULL) { printf ("Got it\n"); goto write; } else { printf ("Not expected\n"); exit (-1); } } write: ; i++; if (i127) *(buff+i) = koi82alt[*(buff+i)-128]; } return 0; } int win_koi(unsigned char *buff, int len) { int i, j; for (i = 0; i < len; i++) { if ( (*(buff+i) >127) && (win2koi8[*(buff+i) - 128] != 0) ) *(buff+i) = win2koi8[*(buff+i)-128]; } return 0; } int koi_win(unsigned char *buff, int len) { int i, j; for (i = 0; i < len; i++) { if ( (*(buff+i) >127) && (koi82win[*(buff+i) - 128] != 0) ) *(buff+i) = koi82win[*(buff+i)-128]; } return 0; } int alt_koi(unsigned char *buff, int len) { int i, j; for (i = 0; i < len; i++) { if (*(buff+i) >127) *(buff+i) = alt2koi8[*(buff+i)-128]; } return 0; } /* main(int argc, char *argv[]) { unsigned char str[200]; while (gets(str) != NULL) { if (argc == 2 ) { koi_alt(str, strlen(str)); printf("%s\n", str); } else { alt_koi(str, strlen(str)); printf("%s\n", str); } } } */