diff options
| author | Jeff Dike <jdike@addtoit.com> | 2005-06-13 15:52:18 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-13 20:58:43 -0700 | 
| commit | a3c77c67a443e631febf708bb0c376caede31657 (patch) | |
| tree | 75672c8dec41054de7b635df59a9f014f6a5ad14 /arch/um/drivers/slirp_user.c | |
| parent | 98fdffccea6cc3fe9dba32c0fcc310bcb5d71529 (diff) | |
| download | olio-linux-3.10-a3c77c67a443e631febf708bb0c376caede31657.tar.xz olio-linux-3.10-a3c77c67a443e631febf708bb0c376caede31657.zip  | |
[PATCH] uml: slirp and slip driver cleanups and fixes
This patch merges a lot of duplicated code in the slip and slirp drivers,
abstracts out the slip protocol, and makes the slip driver work in 2.6.
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/um/drivers/slirp_user.c')
| -rw-r--r-- | arch/um/drivers/slirp_user.c | 100 | 
1 files changed, 19 insertions, 81 deletions
diff --git a/arch/um/drivers/slirp_user.c b/arch/um/drivers/slirp_user.c index c322515c71c..8d91f663d82 100644 --- a/arch/um/drivers/slirp_user.c +++ b/arch/um/drivers/slirp_user.c @@ -12,7 +12,7 @@  #include "user.h"  #include "net_user.h"  #include "slirp.h" -#include "slip_proto.h" +#include "slip_common.h"  #include "helper.h"  #include "os.h" @@ -48,47 +48,32 @@ static int slirp_tramp(char **argv, int fd)  	return(pid);  } -/* XXX This is just a trivial wrapper around os_pipe */ -static int slirp_datachan(int *mfd, int *sfd) -{ -	int fds[2], err; - -	err = os_pipe(fds, 1, 1); -	if(err < 0){ -		printk("slirp_datachan: Failed to open pipe, err = %d\n", -err); -		return(err); -	} - -	*mfd = fds[0]; -	*sfd = fds[1]; -	return(0); -} -  static int slirp_open(void *data)  {  	struct slirp_data *pri = data; -	int sfd, mfd, pid, err; +	int fds[2], pid, err; -	err = slirp_datachan(&mfd, &sfd); +	err = os_pipe(fds, 1, 1);  	if(err)  		return(err); -	pid = slirp_tramp(pri->argw.argv, sfd); - -	if(pid < 0){ -		printk("slirp_tramp failed - errno = %d\n", -pid); -		os_close_file(sfd);	 -		os_close_file(mfd);	 -		return(pid); +	err = slirp_tramp(pri->argw.argv, fds[1]); +	if(err < 0){ +		printk("slirp_tramp failed - errno = %d\n", -err); +		goto out;  	} +	pid = err; -	pri->slave = sfd; -	pri->pos = 0; -	pri->esc = 0; - -	pri->pid = pid; +	pri->slave = fds[1]; +	pri->slip.pos = 0; +	pri->slip.esc = 0; +	pri->pid = err; -	return(mfd); +	return(fds[0]); +out: +	os_close_file(fds[0]); +	os_close_file(fds[1]); +	return err;  }  static void slirp_close(int fd, void *data) @@ -129,48 +114,12 @@ static void slirp_close(int fd, void *data)  int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri)  { -	int i, n, size, start; - -	if(pri->more>0) { -		i = 0; -		while(i < pri->more) { -			size = slip_unesc(pri->ibuf[i++], -					pri->ibuf,&pri->pos,&pri->esc); -			if(size){ -				memcpy(buf, pri->ibuf, size); -				memmove(pri->ibuf, &pri->ibuf[i], pri->more-i); -				pri->more=pri->more-i;  -				return(size); -			} -		} -		pri->more=0; -	} - -	n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos); -	if(n <= 0) return(n); - -	start = pri->pos; -	for(i = 0; i < n; i++){ -		size = slip_unesc(pri->ibuf[start + i], -				pri->ibuf,&pri->pos,&pri->esc); -		if(size){ -			memcpy(buf, pri->ibuf, size); -			memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1)); -			pri->more=n-(i+1);  -			return(size); -		} -	} -	return(0); +	return slip_proto_read(fd, buf, len, &pri->slip);  }  int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri)  { -	int actual, n; - -	actual = slip_esc(buf, pri->obuf, len); -	n = net_write(fd, pri->obuf, actual); -	if(n < 0) return(n); -	else return(len); +	return slip_proto_write(fd, buf, len, &pri->slip);  }  static int slirp_set_mtu(int mtu, void *data) @@ -188,14 +137,3 @@ struct net_user_info slirp_user_info = {  	.delete_address = NULL,  	.max_packet	= BUF_SIZE  }; - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only.  This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-file-style: "linux" - * End: - */  |