~vcs-imports/qemu/maemo

« back to all changes in this revision

Viewing changes to slirp/slirp.c

  • Committer: Riku Voipio
  • Date: 2009-06-08 15:31:58 UTC
  • mfrom: (6281.2.366)
  • mto: This revision was merged to the branch mainline in revision 6452.
  • Revision ID: git-v1:759b334a9739814df2883aa4c41b1c0f5670e90a
Merge commit 'gnu/master' into test

Epic merge

Conflicts:
        Makefile
        block.c
        block.h
        configure
        hw/boards.h
        hw/flash.h
        hw/integratorcp.c
        hw/nand.c
        hw/omap2.c
        hw/omap_i2c.c
        hw/sd.c
        hw/smc91c111.c
        hw/tsc2005.c
        hw/tusb6010.c
        hw/usb-musb.c
        linux-user/syscall.c
        target-arm/machine.c
        target-arm/translate.c

Show diffs side-by-side

added added

removed removed

Lines of Context:
468
468
                            /* Connected */
469
469
                            so->so_state &= ~SS_ISFCONNECTING;
470
470
 
471
 
                            ret = send(so->s, &ret, 0, 0);
 
471
                            ret = send(so->s, (const void *) &ret, 0, 0);
472
472
                            if (ret < 0) {
473
473
                              /* XXXXX Must fix, zero bytes is a NOP */
474
474
                              if (errno == EAGAIN || errno == EWOULDBLOCK ||
734
734
    }
735
735
}
736
736
 
 
737
static void _slirp_redir_loop(void (*func)(void *opaque, int is_udp,
 
738
                                           struct in_addr *laddr, u_int lport,
 
739
                                           struct in_addr *faddr, u_int fport),
 
740
                              void *opaque, int is_udp)
 
741
{
 
742
    struct socket *head = (is_udp ? &udb : &tcb);
 
743
    struct socket *so;
 
744
 
 
745
    for (so = head->so_next; so != head; so = so->so_next) {
 
746
        func(opaque, is_udp,
 
747
             &so->so_laddr, ntohs(so->so_lport),
 
748
             &so->so_faddr, ntohs(so->so_fport));
 
749
    }
 
750
}
 
751
 
 
752
void slirp_redir_loop(void (*func)(void *opaque, int is_udp,
 
753
                                  struct in_addr *laddr, u_int lport,
 
754
                                  struct in_addr *faddr, u_int fport),
 
755
                     void *opaque)
 
756
{
 
757
    _slirp_redir_loop(func, opaque, 0);
 
758
    _slirp_redir_loop(func, opaque, 1);
 
759
}
 
760
 
 
761
/* Unlistens a redirection
 
762
 *
 
763
 * Return value: number of redirs removed */
 
764
int slirp_redir_rm(int is_udp, int host_port)
 
765
{
 
766
    struct socket *so;
 
767
    struct socket *head = (is_udp ? &udb : &tcb);
 
768
    int fport = htons(host_port);
 
769
    int n = 0;
 
770
 
 
771
 loop_again:
 
772
    for (so = head->so_next; so != head; so = so->so_next) {
 
773
        if (so->so_fport == fport) {
 
774
            close(so->s);
 
775
            sofree(so);
 
776
            n++;
 
777
            goto loop_again;
 
778
        }
 
779
    }
 
780
 
 
781
    return n;
 
782
}
 
783
 
737
784
int slirp_redir(int is_udp, int host_port,
738
785
                struct in_addr guest_addr, int guest_port)
739
786
{