X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fum%2Fdrivers%2Fport_user.c;h=bc6afaf74c1a8123ace69f94c5d2d9a340bc6347;hb=a2f44b27303a5353859d77a3e96a1d3f33f56ab7;hp=8dbad941263931766422521404a1367ea03706e0;hpb=a803a40191c815e7162501eddcf9a7e39ba63046;p=linux-2.6.git diff --git a/arch/um/drivers/port_user.c b/arch/um/drivers/port_user.c index 8dbad9412..bc6afaf74 100644 --- a/arch/um/drivers/port_user.c +++ b/arch/um/drivers/port_user.c @@ -18,8 +18,8 @@ #include "user.h" #include "chan_user.h" #include "port.h" -#include "helper.h" #include "os.h" +#include "um_malloc.h" struct port_chan { int raw; @@ -28,7 +28,7 @@ struct port_chan { char dev[sizeof("32768\0")]; }; -void *port_init(char *str, int device, struct chan_opts *opts) +static void *port_init(char *str, int device, const struct chan_opts *opts) { struct port_chan *data; void *kern_data; @@ -48,11 +48,11 @@ void *port_init(char *str, int device, struct chan_opts *opts) } kern_data = port_data(port); - if(kern_data == NULL) + if(kern_data == NULL) return(NULL); data = um_kmalloc(sizeof(*data)); - if(data == NULL) + if(data == NULL) goto err; *data = ((struct port_chan) { .raw = opts->raw, @@ -65,7 +65,7 @@ void *port_init(char *str, int device, struct chan_opts *opts) return(NULL); } -void port_free(void *d) +static void port_free(void *d) { struct port_chan *data = d; @@ -73,21 +73,27 @@ void port_free(void *d) kfree(data); } -int port_open(int input, int output, int primary, void *d, char **dev_out) +static int port_open(int input, int output, int primary, void *d, + char **dev_out) { struct port_chan *data = d; - int fd; + int fd, err; fd = port_wait(data->kernel_data); if((fd >= 0) && data->raw){ - tcgetattr(fd, &data->tt); - raw(fd, 0); + CATCH_EINTR(err = tcgetattr(fd, &data->tt)); + if(err) + return(err); + + err = raw(fd); + if(err) + return(err); } *dev_out = data->dev; return(fd); } -void port_close(int fd, void *d) +static void port_close(int fd, void *d) { struct port_chan *data = d; @@ -95,21 +101,14 @@ void port_close(int fd, void *d) os_close_file(fd); } -int port_console_write(int fd, const char *buf, int n, void *d) -{ - struct port_chan *data = d; - - return(generic_console_write(fd, buf, n, &data->tt)); -} - -struct chan_ops port_ops = { +const struct chan_ops port_ops = { .type = "port", .init = port_init, .open = port_open, .close = port_close, .read = generic_read, .write = generic_write, - .console_write = port_console_write, + .console_write = generic_console_write, .window_size = generic_window_size, .free = port_free, .winch = 1, @@ -118,12 +117,18 @@ struct chan_ops port_ops = { int port_listen_fd(int port) { struct sockaddr_in addr; - int fd, err; + int fd, err, arg; fd = socket(PF_INET, SOCK_STREAM, 0); if(fd == -1) return(-errno); + arg = 1; + if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &arg, sizeof(arg)) < 0){ + err = -errno; + goto out; + } + addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(INADDR_ANY); @@ -177,7 +182,7 @@ int port_connection(int fd, int *socket, int *pid_out) return(new); err = os_pipe(socket, 0, 0); - if(err < 0) + if(err < 0) goto out_close; data = ((struct port_pre_exec_data)