/* 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); } } } */