diff -rc --exclude '*~' qemu-kvm-0.12.1.2-orig/slirp/socket.c qemu-kvm-0.12.1.2/slirp/socket.c
*** qemu-kvm-0.12.1.2-orig/slirp/socket.c	2009-12-29 21:46:34.000000000 +0100
--- qemu-kvm-0.12.1.2/slirp/socket.c	2010-01-03 20:24:11.000000000 +0100
***************
*** 588,593 ****
--- 588,594 ----
             u_int lport, int flags)
  {
  	struct sockaddr_in addr;
+ 	struct sockaddr_un addr_un;
  	struct socket *so;
  	int s, opt = 1;
  	socklen_t addrlen = sizeof(addr);
***************
*** 622,634 ****
  	so->so_lport = lport; /* Kept in network format */
  	so->so_laddr.s_addr = laddr; /* Ditto */
  
! 	addr.sin_family = AF_INET;
! 	addr.sin_addr.s_addr = haddr;
! 	addr.sin_port = hport;
  
! 	if (((s = qemu_socket(AF_INET,SOCK_STREAM,0)) < 0) ||
  	    (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)) < 0) ||
! 	    (bind(s,(struct sockaddr *)&addr, sizeof(addr)) < 0) ||
  	    (listen(s,1) < 0)) {
  		int tmperrno = errno; /* Don't clobber the real reason we failed */
  
--- 623,644 ----
  	so->so_lport = lport; /* Kept in network format */
  	so->so_laddr.s_addr = laddr; /* Ditto */
  
! 	so->so_uds = ntohs(hport) >= 0xff00;
! 	
! 	if (so->so_uds) {
! 	    addr_un.sun_family = AF_UNIX;
! 	    sprintf(addr_un.sun_path, "./%d.socket", ntohs(hport));
! 	    unlink(addr_un.sun_path);
! 	} else {
! 	    addr.sin_family = AF_INET;
! 	    addr.sin_addr.s_addr = haddr;
! 	    addr.sin_port = hport;
! 	}
  
!  	if (((s = qemu_socket(so->so_uds ? PF_UNIX : AF_INET, SOCK_STREAM, 0)) < 0) ||
  	    (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)) < 0) ||
! 	    (bind(s, so->so_uds ? (struct sockaddr *) &addr_un : (struct sockaddr *) &addr,
! 		so->so_uds ? sizeof(addr_un) : sizeof(addr)) < 0) ||
  	    (listen(s,1) < 0)) {
  		int tmperrno = errno; /* Don't clobber the real reason we failed */
  
***************
*** 644,655 ****
  	}
  	setsockopt(s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int));
  
! 	getsockname(s,(struct sockaddr *)&addr,&addrlen);
! 	so->so_fport = addr.sin_port;
! 	if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr)
! 	   so->so_faddr = slirp->vhost_addr;
! 	else
! 	   so->so_faddr = addr.sin_addr;
  
  	so->s = s;
  	return so;
--- 654,670 ----
  	}
  	setsockopt(s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int));
  
!         if (so->so_uds) {
!             so->so_fport = hport;
!             so->so_faddr = slirp->vhost_addr;
!         } else {
!             getsockname(s,(struct sockaddr *)&addr,&addrlen);
!             so->so_fport = addr.sin_port;
!             if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr)
!                 so->so_faddr = slirp->vhost_addr;
!             else
!                 so->so_faddr = addr.sin_addr;
!         }
  
  	so->s = s;
  	return so;
diff -rc --exclude '*~' qemu-kvm-0.12.1.2-orig/slirp/socket.h qemu-kvm-0.12.1.2/slirp/socket.h
*** qemu-kvm-0.12.1.2-orig/slirp/socket.h	2009-12-29 21:46:34.000000000 +0100
--- qemu-kvm-0.12.1.2/slirp/socket.h	2010-01-03 20:20:50.000000000 +0100
***************
*** 33,39 ****
    struct in_addr so_laddr;	   /* local host table entry */
    u_int16_t so_fport;		   /* foreign port */
    u_int16_t so_lport;		   /* local port */
! 
    u_int8_t	so_iptos;	/* Type of service */
    u_int8_t	so_emu;		/* Is the socket emulated? */
  
--- 33,40 ----
    struct in_addr so_laddr;	   /* local host table entry */
    u_int16_t so_fport;		   /* foreign port */
    u_int16_t so_lport;		   /* local port */
!   int so_uds;                      /* foreign "port" is a unix domain socket */
!     
    u_int8_t	so_iptos;	/* Type of service */
    u_int8_t	so_emu;		/* Is the socket emulated? */
  
diff -rc --exclude '*~' qemu-kvm-0.12.1.2-orig/slirp/tcp_subr.c qemu-kvm-0.12.1.2/slirp/tcp_subr.c
*** qemu-kvm-0.12.1.2-orig/slirp/tcp_subr.c	2009-12-29 21:46:34.000000000 +0100
--- qemu-kvm-0.12.1.2/slirp/tcp_subr.c	2010-01-03 20:20:50.000000000 +0100
***************
*** 383,389 ****
  	Slirp *slirp = inso->slirp;
  	struct socket *so;
  	struct sockaddr_in addr;
! 	socklen_t addrlen = sizeof(struct sockaddr_in);
  	struct tcpcb *tp;
  	int s, opt;
  
--- 383,390 ----
  	Slirp *slirp = inso->slirp;
  	struct socket *so;
  	struct sockaddr_in addr;
! 	struct sockaddr_un addr_un;
! 	socklen_t addrlen;
  	struct tcpcb *tp;
  	int s, opt;
  
***************
*** 413,419 ****
  
  	(void) tcp_mss(sototcpcb(so), 0);
  
! 	if ((s = accept(inso->s,(struct sockaddr *)&addr,&addrlen)) < 0) {
  		tcp_close(sototcpcb(so)); /* This will sofree() as well */
  		return;
  	}
--- 414,423 ----
  
  	(void) tcp_mss(sototcpcb(so), 0);
  
!         addrlen = inso->so_uds ? sizeof(struct sockaddr_un) : sizeof(struct sockaddr_in);
! 
! 	if ((inso->so_uds && (s = accept(inso->s, (struct sockaddr *) &addr_un, &addrlen)) < 0) ||
!             (!inso->so_uds && (s = accept(inso->s, (struct sockaddr *) &addr, &addrlen)) < 0)) {
  		tcp_close(sototcpcb(so)); /* This will sofree() as well */
  		return;
  	}
***************
*** 425,435 ****
  	opt = 1;
  	setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char *)&opt,sizeof(int));
  
! 	so->so_fport = addr.sin_port;
! 	so->so_faddr = addr.sin_addr;
! 	/* Translate connections from localhost to the real hostname */
! 	if (so->so_faddr.s_addr == 0 || so->so_faddr.s_addr == loopback_addr.s_addr)
! 	   so->so_faddr = slirp->vhost_addr;
  
  	/* Close the accept() socket, set right state */
  	if (inso->so_state & SS_FACCEPTONCE) {
--- 429,444 ----
  	opt = 1;
  	setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char *)&opt,sizeof(int));
  
!         if (inso->so_uds) {
!             so->so_fport = htons(s); /* use the fd number as the foreign port */
!             so->so_faddr = slirp->vhost_addr;
!         } else {
!             so->so_fport = addr.sin_port;
!             so->so_faddr = addr.sin_addr;
!             /* Translate connections from localhost to the real hostname */
!             if (so->so_faddr.s_addr == 0 || so->so_faddr.s_addr == loopback_addr.s_addr)
!                 so->so_faddr = slirp->vhost_addr;
!         }
  
  	/* Close the accept() socket, set right state */
  	if (inso->so_state & SS_FACCEPTONCE) {
