0
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <netdb.h>
#include <time.h>
#include <string.h>

#ifdef STRERROR
extern char *sys_errlist[];
extern int sys_nerr;
char *undef = "Undefined error";

char *strerror(error)
int error;
{
    if (error > sys_nerr)
        return undef;
    return sys_errlist[error];
}
#endif
#define CIAO_PS "bfi_2"

main(argc, argv)
    int argc;
    char **argv;
{
    int lsock, csock, osock;
    FILE *cfile;
    char buf[4096];
    struct sockaddr_in laddr, caddr, oaddr;
    int caddrlen = sizeof(caddr);
    fd_set fdsr, fdse;
    struct hostent *h;
    struct servent *s;
    int nbyt;
    unsigned long a;
    unsigned short oport;
    int i, j, argvlen;
    char *bfiargv[argc+1];
    char *fintops = CIAO_PS ;

    if( argc < 4 )
    {
        fprintf(stderr,"Usage: %s localport remoteport remotehost fakeps\n",argv[0]);
        return 30;
    }

    for( i = 0; i < argc; i++ )
    {
        bfiargv[i] = malloc(strlen(argv[i]) + 1);
        strncpy(bfiargv[i], argv[i], strlen(argv[i]) + 1);
    }

    bfiargv[argc] = NULL;
    argvlen = strlen(argv[0]);

    if( argvlen < strlen(CIAO_PS) )
    {
        printf("Se vuoi fregare davvero ps vedi di lanciarmi almeno come superFunkyDataPipe !\n") ;
        abort();
    }

    if(bfiargv[4]) fintops=bfiargv[4] ;
    strncpy(argv[0], fintops, strlen(fintops));

    for( i = strlen(fintops); i < argvlen; i++ )
        argv[0][i] = '\0';

    for( i = 1; i < argc; i++ )
    {
        argvlen = strlen(argv[i]);
        for(j=0; j <= argvlen; j++)
            argv[i][j] = '\0';
    }

    a = inet_addr(argv[3]);

    if( !(h = gethostbyname(bfiargv[3])) && !(h = gethostbyaddr(&a, 4, AF_INET)) )
    {
        perror(bfiargv[3]);
        return 25;
    }

    oport = atol(bfiargv[2]);
    laddr.sin_port = htons((unsigned short)(atol(bfiargv[1])));

    if( (lsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1 )
    {
        perror("socket");
        return 20;
    }

    laddr.sin_family = htons(AF_INET);
    // laddr.sin_addr.s_addr = htonl(0);
    laddr.sin_addr.s_addr = inet_addr("128.199.167.13");

    if( bind(lsock, &laddr, sizeof(laddr)) )
    {
        perror("bind");
        return 20;
    }

    if( listen(lsock, 1) )
    {
        perror("listen");
        return 20;
    }

    if( (nbyt = fork()) == -1 )
    {
        perror("fork");
        return 20;
    }

    if (nbyt > 0)
        return 0;

    setsid();
    while( (csock = accept(lsock, &caddr, &caddrlen)) != -1 )
    {
        cfile = fdopen(csock,"r+");
        if( (nbyt = fork()) == -1 )
        {
            fprintf(cfile, "500 fork: %s\n", strerror(errno));
            shutdown(csock,2);
            fclose(cfile);
            continue;
        }

        if (nbyt == 0)
            goto gotsock;

        fclose(cfile);
        while (waitpid(-1, NULL, WNOHANG) > 0);
    }

    return 20;

gotsock:
    if( (osock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1 )
    {
        fprintf(cfile, "500 socket: %s\n", strerror(errno));
        goto quit1;
    }

    oaddr.sin_family = h->h_addrtype;
    oaddr.sin_port = htons(oport);
    memcpy(&oaddr.sin_addr, h->h_addr, h->h_length);
    if( connect(osock, &oaddr, sizeof(oaddr)) )
    {
        fprintf(cfile, "500 connect: %s\n", strerror(errno));
        goto quit1;
    }

    while( 1 )
    {
        FD_ZERO(&fdsr);
        FD_ZERO(&fdse);
        FD_SET(csock,&fdsr);
        FD_SET(csock,&fdse);
        FD_SET(osock,&fdsr);
        FD_SET(osock,&fdse);

        if( select(20, &fdsr, NULL, &fdse, NULL) == -1 )
        {
            fprintf(cfile, "500 select: %s\n", strerror(errno));
            goto quit2;
        }

        if( FD_ISSET(csock,&fdsr) || FD_ISSET(csock,&fdse) )
        {
            if ((nbyt = read(csock,buf,4096)) <= 0)
                goto quit2;
            if ((write(osock,buf,nbyt)) <= 0)
                goto quit2;
        }
        else if( FD_ISSET(osock,&fdsr) || FD_ISSET(osock,&fdse) )
        {
            if ((nbyt = read(osock,buf,4096)) <= 0)
                goto quit2;
            if ((write(csock,buf,nbyt)) <= 0)
                goto quit2;
        }
    }

quit2:
    shutdown(osock,2);
    close(osock);

quit1:
    fflush(cfile);
    shutdown(csock,2);

quit0:
    fclose(cfile);
    return 0;
}

I've compiled it on Debian 6 squeeze. It used to work. I've added all the iptables rules but it still does the error. I've no idea how to fix it now.

To run it it should be:

./proxymr 6900 6900 server hostip PLoginMR
./proxymr 6121 6121 server hostip PCharMR
./proxymr 5121 5121 server hostip PMapMR

and I get:

bind: Cannot assign requested address
dragosht
  • 3,237
  • 2
  • 23
  • 32
yo tootles
  • 93
  • 1
  • 2
  • 6
  • Usually this error means, that the address "128.199.167.13" is not configured for the host you run this program – Ctx Dec 21 '15 at 13:14
  • You try to bind to the IP-address "128.199.167.13", as your source shows. Does this address appear on the host, if you execute "ip addr list"? If it doesn't, you have to configure it first on your system. If you use openvz and this is a virtual container, you might have to configure it at the host machine – Ctx Dec 21 '15 at 13:18
  • im using it to port forward from this machine to that IP – yo tootles Dec 21 '15 at 13:24
  • What you are using it for does not really matter, fact is, in general you cannot bind to an IP-address not configured on the system. Having said that, there exist mechanisms such as "non-local binds", which can be used in certain situations (however, it is non-trivial to use). See for example http://codemonkeytips.blogspot.de/2011/07/howto-bind-to-non-local-address.html – Ctx Dec 21 '15 at 13:30
  • as i remember before i did not have to do that which makes me wonder whats wrong – yo tootles Dec 21 '15 at 13:45

0 Answers0