summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdike <jdike>2003-09-14 03:04:12 +0000
committerjdike <jdike>2003-09-14 03:04:12 +0000
commitea9c908c278b2d72df26a408746a9b47f038d180 (patch)
treeba8a37cb99638bd27d3fc4ba8993ee7873e8098e
parentcace4203102952daf57845d3a522e46d6a12081d (diff)
downloaduml-history-ea9c908c278b2d72df26a408746a9b47f038d180.tar.gz
Merged Steve Schmidtke's cleanup patches, which make UML use the os_*
interfaces more consistently, plus a couple of cleanups from Stian.
-rw-r--r--arch/um/drivers/chan_kern.c3
-rw-r--r--arch/um/drivers/chan_user.c96
-rw-r--r--arch/um/drivers/cow_user.c35
-rw-r--r--arch/um/drivers/daemon_user.c26
-rw-r--r--arch/um/drivers/fd.c3
-rw-r--r--arch/um/drivers/harddog_user.c61
-rw-r--r--arch/um/drivers/hostaudio_user.c53
-rw-r--r--arch/um/drivers/line.c2
-rw-r--r--arch/um/drivers/mcast_user.c16
-rw-r--r--arch/um/drivers/mconsole_kern.c2
-rw-r--r--arch/um/drivers/net_kern.c3
-rw-r--r--arch/um/drivers/net_user.c46
-rw-r--r--arch/um/drivers/null.c1
-rw-r--r--arch/um/drivers/port_kern.c2
-rw-r--r--arch/um/drivers/port_user.c31
-rw-r--r--arch/um/drivers/pty.c23
-rw-r--r--arch/um/drivers/slip_user.c69
-rw-r--r--arch/um/drivers/slirp_user.c15
-rw-r--r--arch/um/drivers/tty.c4
-rw-r--r--arch/um/drivers/ubd_kern.c48
-rw-r--r--arch/um/drivers/ubd_user.c145
-rw-r--r--arch/um/drivers/xterm.c21
-rw-r--r--arch/um/fs/hostfs/hostfs_kern.c21
-rw-r--r--arch/um/fs/hppfs/hppfs_kern.c31
-rw-r--r--arch/um/include/os.h44
-rw-r--r--arch/um/kernel/helper.c51
-rw-r--r--arch/um/kernel/initrd_user.c13
-rw-r--r--arch/um/kernel/irq.c3
-rw-r--r--arch/um/kernel/irq_user.c37
-rw-r--r--arch/um/kernel/ksyms.c15
-rw-r--r--arch/um/kernel/mem_user.c50
-rw-r--r--arch/um/kernel/physmem.c8
-rw-r--r--arch/um/kernel/process.c8
-rw-r--r--arch/um/kernel/process_kern.c3
-rw-r--r--arch/um/kernel/sigio_user.c89
-rw-r--r--arch/um/kernel/signal_kern.c3
-rw-r--r--arch/um/kernel/skas/mem_user.c21
-rw-r--r--arch/um/kernel/skas/process.c8
-rw-r--r--arch/um/kernel/smp.c18
-rw-r--r--arch/um/kernel/tempfile.c6
-rw-r--r--arch/um/kernel/time_kern.c4
-rw-r--r--arch/um/kernel/trap_user.c2
-rw-r--r--arch/um/kernel/tt/mem_user.c7
-rw-r--r--arch/um/kernel/tt/process_kern.c15
-rw-r--r--arch/um/kernel/tt/ptproxy/proxy.c17
-rw-r--r--arch/um/kernel/tt/tracer.c23
-rw-r--r--arch/um/kernel/tty_log.c22
-rw-r--r--arch/um/kernel/umid.c35
-rw-r--r--arch/um/kernel/user_syms.c2
-rw-r--r--arch/um/kernel/user_util.c4
-rw-r--r--arch/um/main.c7
-rw-r--r--arch/um/os-Linux/drivers/ethertap_user.c56
-rw-r--r--arch/um/os-Linux/drivers/tuntap_user.c53
-rw-r--r--arch/um/os-Linux/file.c321
-rw-r--r--arch/um/os-Linux/process.c43
-rw-r--r--arch/um/os-Linux/tty.c10
-rw-r--r--arch/um/sys-i386/bugs.c29
-rw-r--r--include/asm-um/pgalloc.h6
58 files changed, 1087 insertions, 703 deletions
diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c
index 809f1aa..0f69c64 100644
--- a/arch/um/drivers/chan_kern.c
+++ b/arch/um/drivers/chan_kern.c
@@ -421,7 +421,8 @@ int parse_chan_pair(char *str, struct list_head *chans, int pri, int device,
INIT_LIST_HEAD(chans);
}
- if((out = strchr(str, ',')) != NULL){
+ out = strchr(str, ',');
+ if(out != NULL){
in = str;
*out = '\0';
out++;
diff --git a/arch/um/drivers/chan_user.c b/arch/um/drivers/chan_user.c
index e1e46e8..6874489 100644
--- a/arch/um/drivers/chan_user.c
+++ b/arch/um/drivers/chan_user.c
@@ -7,7 +7,6 @@
#include <stdlib.h>
#include <errno.h>
#include <termios.h>
-#include <fcntl.h>
#include <string.h>
#include <signal.h>
#include <sys/stat.h>
@@ -24,29 +23,27 @@
void generic_close(int fd, void *unused)
{
- close(fd);
+ os_close_file(fd);
}
int generic_read(int fd, char *c_out, void *unused)
{
int n;
- n = read(fd, c_out, sizeof(*c_out));
- if(n < 0){
- if(errno == EAGAIN) return(0);
- return(-errno);
- }
- else if(n == 0) return(-EIO);
- return(1);
+ n = os_read_file(fd, c_out, sizeof(*c_out));
+
+ if(n == -EAGAIN)
+ return(0);
+ else if(n == 0)
+ return(-EIO);
+ return(n);
}
+/* XXX Trivial wrapper arounf os_write_file */
+
int generic_write(int fd, const char *buf, int n, void *unused)
{
- int count;
-
- count = write(fd, buf, n);
- if(count < 0) return(-errno);
- return(count);
+ return(os_write_file(fd, buf, n));
}
int generic_console_write(int fd, const char *buf, int n, void *unused)
@@ -68,15 +65,18 @@ int generic_console_write(int fd, const char *buf, int n, void *unused)
int generic_window_size(int fd, void *unused, unsigned short *rows_out,
unsigned short *cols_out)
{
- struct winsize size;
- int ret = 0;
-
- if(ioctl(fd, TIOCGWINSZ, &size) == 0){
- ret = ((*rows_out != size.ws_row) ||
- (*cols_out != size.ws_col));
- *rows_out = size.ws_row;
- *cols_out = size.ws_col;
- }
+ int rows, cols;
+ int ret;
+
+ ret = os_window_size(fd, &rows, &cols);
+ if(ret < 0)
+ return(ret);
+
+ ret = ((*rows_out != rows) || (*cols_out != cols));
+
+ *rows_out = rows;
+ *cols_out = cols;
+
return(ret);
}
@@ -100,14 +100,16 @@ static int winch_thread(void *arg)
struct winch_data *data = arg;
sigset_t sigs;
int pty_fd, pipe_fd;
+ int count, err;
char c = 1;
- close(data->close_me);
+ os_close_file(data->close_me);
pty_fd = data->pty_fd;
pipe_fd = data->pipe_fd;
- if(write(pipe_fd, &c, sizeof(c)) != sizeof(c))
+ count = os_write_file(pipe_fd, &c, sizeof(c));
+ if(count != sizeof(c))
printk("winch_thread : failed to write synchronization "
- "byte, errno = %d\n", errno);
+ "byte, err = %d\n", -count);
signal(SIGWINCH, winch_handler);
sigfillset(&sigs);
@@ -123,26 +125,24 @@ static int winch_thread(void *arg)
exit(1);
}
- if(ioctl(pty_fd, TIOCSCTTY, 0) < 0){
- printk("winch_thread : TIOCSCTTY failed, errno = %d\n", errno);
- exit(1);
- }
- if(tcsetpgrp(pty_fd, os_getpid()) < 0){
- printk("winch_thread : tcsetpgrp failed, errno = %d\n", errno);
+ err = os_new_tty_pgrp(pty_fd, os_getpid());
+ if(err < 0){
+ printk("winch_thread : new_tty_pgrp failed, err = %d\n", -err);
exit(1);
}
- if(read(pipe_fd, &c, sizeof(c)) != sizeof(c))
+ count = os_read_file(pipe_fd, &c, sizeof(c));
+ if(count != sizeof(c))
printk("winch_thread : failed to read synchronization byte, "
- "errno = %d\n", errno);
+ "err = %d\n", -count);
while(1){
pause();
- if(write(pipe_fd, &c, sizeof(c)) != sizeof(c)){
- printk("winch_thread : write failed, errno = %d\n",
- errno);
- }
+ count = os_write_file(pipe_fd, &c, sizeof(c));
+ if(count != sizeof(c))
+ printk("winch_thread : write failed, err = %d\n",
+ -count);
}
}
@@ -154,8 +154,8 @@ static int winch_tramp(int fd, void *device_data, int *fd_out)
char c;
err = os_pipe(fds, 1, 1);
- if(err){
- printk("winch_tramp : os_pipe failed, errno = %d\n", -err);
+ if(err < 0){
+ printk("winch_tramp : os_pipe failed, err = %d\n", -err);
return(err);
}
@@ -168,12 +168,12 @@ static int winch_tramp(int fd, void *device_data, int *fd_out)
return(pid);
}
- close(fds[1]);
+ os_close_file(fds[1]);
*fd_out = fds[0];
- n = read(fds[0], &c, sizeof(c));
+ n = os_read_file(fds[0], &c, sizeof(c));
if(n != sizeof(c)){
printk("winch_tramp : failed to read synchronization byte\n");
- printk("read returned %d, errno = %d\n", n, errno);
+ printk("read failed, err = %d\n", -n);
printk("fd %d will not support SIGWINCH\n", fd);
*fd_out = -1;
}
@@ -183,9 +183,11 @@ static int winch_tramp(int fd, void *device_data, int *fd_out)
void register_winch(int fd, void *device_data)
{
int pid, thread, thread_fd;
+ int count;
char c = 1;
- if(!isatty(fd)) return;
+ if(!isatty(fd))
+ return;
pid = tcgetpgrp(fd);
if(!CHOOSE_MODE_PROC(is_tracer_winch, is_skas_winch, pid, fd,
@@ -194,9 +196,11 @@ void register_winch(int fd, void *device_data)
if(fd != -1){
register_winch_irq(thread_fd, fd, thread, device_data);
- if(write(thread_fd, &c, sizeof(c)) != sizeof(c))
+ count = os_write_file(thread_fd, &c, sizeof(c));
+ if(count != sizeof(c))
printk("register_winch : failed to write "
- "synchronization byte\n");
+ "synchronization byte, err = %d\n",
+ -count);
}
}
}
diff --git a/arch/um/drivers/cow_user.c b/arch/um/drivers/cow_user.c
index 3951642..8a77065 100644
--- a/arch/um/drivers/cow_user.c
+++ b/arch/um/drivers/cow_user.c
@@ -3,12 +3,13 @@
#include <errno.h>
#include <unistd.h>
#include <byteswap.h>
-#include <sys/stat.h>
#include <sys/time.h>
#include <sys/param.h>
#include <sys/user.h>
#include <netinet/in.h>
+#include "os.h"
+
#include "cow.h"
#include "cow_sys.h"
@@ -161,14 +162,13 @@ int write_cow_header(char *cow_file, int fd, char *backing_file,
int sectorsize, int alignment, long long *size)
{
struct cow_header_v3 *header;
- struct stat64 buf;
+ struct uml_stat buf;
int err;
err = cow_seek_file(fd, 0);
- if(err != 0){
- cow_printf("write_cow_header - lseek failed, errno = %d\n",
- errno);
- return(-errno);
+ if(err < 0){
+ cow_printf("write_cow_header - lseek failed, err = %d\n", -err);
+ goto out;
}
err = -ENOMEM;
@@ -192,18 +192,17 @@ int write_cow_header(char *cow_file, int fd, char *backing_file,
backing_file))
goto out_free;
- err = stat64(header->backing_file, &buf);
+ err = os_stat_file(header->backing_file, &buf);
if(err < 0){
- cow_printf("Stat of backing file '%s' failed, errno = %d\n",
- header->backing_file, errno);
- err = -errno;
+ cow_printf("Stat of backing file '%s' failed, err = %d\n",
+ header->backing_file, -err);
goto out_free;
}
err = cow_file_size(header->backing_file, size);
- if(err){
+ if(err < 0){
cow_printf("Couldn't get size of backing file '%s', "
- "errno = %d\n", header->backing_file, -*size);
+ "err = %d\n", header->backing_file, -err);
goto out_free;
}
@@ -213,10 +212,10 @@ int write_cow_header(char *cow_file, int fd, char *backing_file,
header->alignment = htonl(alignment);
header->cow_format = COW_BITMAP;
- err = write(fd, header, sizeof(*header));
+ err = os_write_file(fd, header, sizeof(*header));
if(err != sizeof(*header)){
cow_printf("Write of header to new COW file '%s' failed, "
- "errno = %d\n", cow_file, errno);
+ "err = %d\n", cow_file, -err);
goto out_free;
}
err = 0;
@@ -345,8 +344,8 @@ int init_cow_file(int fd, char *cow_file, char *backing_file, int sectorsize,
offset = *data_offset_out + size - sizeof(zero);
err = cow_seek_file(fd, offset);
- if(err){
- cow_printf("cow bitmap lseek failed : errno = %d\n", errno);
+ if(err < 0){
+ cow_printf("cow bitmap lseek failed : err = %d\n", -err);
goto out;
}
@@ -356,9 +355,9 @@ int init_cow_file(int fd, char *cow_file, char *backing_file, int sectorsize,
*/
err = cow_write_file(fd, &zero, sizeof(zero));
if(err != sizeof(zero)){
- err = -EINVAL;
cow_printf("Write of bitmap to new COW file '%s' failed, "
- "errno = %d\n", cow_file, errno);
+ "err = %d\n", cow_file, -err);
+ err = -EINVAL;
goto out;
}
diff --git a/arch/um/drivers/daemon_user.c b/arch/um/drivers/daemon_user.c
index de71aec..024972f 100644
--- a/arch/um/drivers/daemon_user.c
+++ b/arch/um/drivers/daemon_user.c
@@ -53,7 +53,8 @@ static int connect_to_switch(struct daemon_data *pri)
struct request_v3 req;
int fd, n, err;
- if((pri->control = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
+ pri->control = socket(AF_UNIX, SOCK_STREAM, 0);
+ if(pri->control < 0){
printk("daemon_open : control socket failed, errno = %d\n",
errno);
return(-errno);
@@ -67,7 +68,8 @@ static int connect_to_switch(struct daemon_data *pri)
goto out;
}
- if((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0){
+ fd = socket(AF_UNIX, SOCK_DGRAM, 0);
+ if(fd < 0){
printk("daemon_open : data socket failed, errno = %d\n",
errno);
err = -errno;
@@ -91,18 +93,18 @@ static int connect_to_switch(struct daemon_data *pri)
req.version = SWITCH_VERSION;
req.type = REQ_NEW_CONTROL;
req.sock = *local_addr;
- n = write(pri->control, &req, sizeof(req));
+ n = os_write_file(pri->control, &req, sizeof(req));
if(n != sizeof(req)){
- printk("daemon_open : control setup request returned %d, "
- "errno = %d\n", n, errno);
+ printk("daemon_open : control setup request failed, err = %d\n",
+ -n);
err = -ENOTCONN;
goto out;
}
- n = read(pri->control, sun, sizeof(*sun));
+ n = os_read_file(pri->control, sun, sizeof(*sun));
if(n != sizeof(*sun)){
- printk("daemon_open : read of data socket returned %d, "
- "errno = %d\n", n, errno);
+ printk("daemon_open : read of data socket failed, err = %d\n",
+ -n);
err = -ENOTCONN;
goto out_close;
}
@@ -111,9 +113,9 @@ static int connect_to_switch(struct daemon_data *pri)
return(fd);
out_close:
- close(fd);
+ os_close_file(fd);
out:
- close(pri->control);
+ os_close_file(pri->control);
return(err);
}
@@ -153,8 +155,8 @@ static void daemon_remove(void *data)
{
struct daemon_data *pri = data;
- close(pri->fd);
- close(pri->control);
+ os_close_file(pri->fd);
+ os_close_file(pri->control);
if(pri->data_addr != NULL) kfree(pri->data_addr);
if(pri->ctl_addr != NULL) kfree(pri->ctl_addr);
if(pri->local_addr != NULL) kfree(pri->local_addr);
diff --git a/arch/um/drivers/fd.c b/arch/um/drivers/fd.c
index 4ac314c..33c6c78 100644
--- a/arch/um/drivers/fd.c
+++ b/arch/um/drivers/fd.c
@@ -35,7 +35,8 @@ void *fd_init(char *str, int device, struct chan_opts *opts)
printk("fd_init : couldn't parse file descriptor '%s'\n", str);
return(NULL);
}
- if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL);
+ data = um_kmalloc(sizeof(*data));
+ if(data == NULL) return(NULL);
*data = ((struct fd_chan) { .fd = n,
.raw = opts->raw });
return(data);
diff --git a/arch/um/drivers/harddog_user.c b/arch/um/drivers/harddog_user.c
index cbbf41b..a51dc09 100644
--- a/arch/um/drivers/harddog_user.c
+++ b/arch/um/drivers/harddog_user.c
@@ -27,10 +27,10 @@ static void pre_exec(void *d)
dup2(data->stdin, 0);
dup2(data->stdout, 1);
dup2(data->stdout, 2);
- close(data->stdin);
- close(data->stdout);
- close(data->close_me[0]);
- close(data->close_me[1]);
+ os_close_file(data->stdin);
+ os_close_file(data->stdout);
+ os_close_file(data->close_me[0]);
+ os_close_file(data->close_me[1]);
}
int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
@@ -44,15 +44,15 @@ int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
char **args = NULL;
err = os_pipe(in_fds, 1, 0);
- if(err){
- printk("harddog_open - os_pipe failed, errno = %d\n", -err);
- return(err);
+ if(err < 0){
+ printk("harddog_open - os_pipe failed, err = %d\n", -err);
+ goto out;
}
err = os_pipe(out_fds, 1, 0);
- if(err){
- printk("harddog_open - os_pipe failed, errno = %d\n", -err);
- return(err);
+ if(err < 0){
+ printk("harddog_open - os_pipe failed, err = %d\n", -err);
+ goto out_close_in;
}
data.stdin = out_fds[0];
@@ -72,42 +72,47 @@ int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
pid = run_helper(pre_exec, &data, args, NULL);
- close(out_fds[0]);
- close(in_fds[1]);
+ os_close_file(out_fds[0]);
+ os_close_file(in_fds[1]);
if(pid < 0){
err = -pid;
- printk("harddog_open - run_helper failed, errno = %d\n", err);
- goto out;
+ printk("harddog_open - run_helper failed, errno = %d\n", -err);
+ goto out_close_out;
}
- n = read(in_fds[0], &c, sizeof(c));
+ n = os_read_file(in_fds[0], &c, sizeof(c));
if(n == 0){
printk("harddog_open - EOF on watchdog pipe\n");
helper_wait(pid);
err = -EIO;
- goto out;
+ goto out_close_out;
}
else if(n < 0){
printk("harddog_open - read of watchdog pipe failed, "
- "errno = %d\n", errno);
+ "err = %d\n", -n);
helper_wait(pid);
- err = -errno;
- goto out;
+ err = n;
+ goto out_close_out;
}
*in_fd_ret = in_fds[0];
*out_fd_ret = out_fds[1];
return(0);
+
+ out_close_in:
+ os_close_file(in_fds[0]);
+ os_close_file(in_fds[1]);
+ out_close_out:
+ os_close_file(out_fds[0]);
+ os_close_file(out_fds[1]);
out:
- close(out_fds[1]);
- close(in_fds[0]);
return(err);
}
void stop_watchdog(int in_fd, int out_fd)
{
- close(in_fd);
- close(out_fd);
+ os_close_file(in_fd);
+ os_close_file(out_fd);
}
int ping_watchdog(int fd)
@@ -115,11 +120,11 @@ int ping_watchdog(int fd)
int n;
char c = '\n';
- n = write(fd, &c, sizeof(c));
- if(n < sizeof(c)){
- printk("ping_watchdog - write failed, errno = %d\n",
- errno);
- return(-errno);
+ n = os_write_file(fd, &c, sizeof(c));
+ if(n != sizeof(c)){
+ printk("ping_watchdog - write failed, err = %d\n", -n);
+ if(n < 0) return(n)
+ return(-EIO);
}
return 1;
diff --git a/arch/um/drivers/hostaudio_user.c b/arch/um/drivers/hostaudio_user.c
index c32fa1b..f4bc8f1 100644
--- a/arch/um/drivers/hostaudio_user.c
+++ b/arch/um/drivers/hostaudio_user.c
@@ -4,9 +4,6 @@
*/
#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include "hostaudio.h"
@@ -20,16 +17,11 @@
ssize_t hostaudio_read_user(struct hostaudio_state *state, char *buffer,
size_t count, loff_t *ppos)
{
- ssize_t ret;
-
#ifdef DEBUG
printk("hostaudio: read_user called, count = %d\n", count);
#endif
- ret = read(state->fd, buffer, count);
-
- if(ret < 0) return(-errno);
- return(ret);
+ return(os_read_file(state->fd, buffer, count));
}
ssize_t hostaudio_write_user(struct hostaudio_state *state, const char *buffer,
@@ -41,24 +33,19 @@ ssize_t hostaudio_write_user(struct hostaudio_state *state, const char *buffer,
printk("hostaudio: write_user called, count = %d\n", count);
#endif
- ret = write(state->fd, buffer, count);
+ return(os_write_file(state->fd, buffer, count));
- if(ret < 0) return(-errno);
return(ret);
}
int hostaudio_ioctl_user(struct hostaudio_state *state, unsigned int cmd,
unsigned long arg)
{
- int ret;
#ifdef DEBUG
printk("hostaudio: ioctl_user called, cmd = %u\n", cmd);
#endif
- ret = ioctl(state->fd, cmd, arg);
-
- if(ret < 0) return(-errno);
- return(ret);
+ return(os_ioctl_generic(state->fd, cmd, arg));
}
int hostaudio_open_user(struct hostaudio_state *state, int r, int w, char *dsp)
@@ -69,12 +56,13 @@ int hostaudio_open_user(struct hostaudio_state *state, int r, int w, char *dsp)
state->fd = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0);
- if(state->fd >= 0) return(0);
-
- printk("hostaudio_open_user failed to open '%s', errno = %d\n",
- dsp, errno);
+ if(state->fd < 0) {
+ printk("hostaudio_open_user failed to open '%s', err = %d\n",
+ dsp, -state->fd);
+ return(state->fd);
+ }
- return(-errno);
+ return(0);
}
int hostaudio_release_user(struct hostaudio_state *state)
@@ -83,8 +71,8 @@ int hostaudio_release_user(struct hostaudio_state *state)
printk("hostaudio: release called\n");
#endif
if(state->fd >= 0){
- close(state->fd);
- state->fd=-1;
+ os_close_file(state->fd);
+ state->fd = -1;
}
return(0);
@@ -95,15 +83,11 @@ int hostaudio_release_user(struct hostaudio_state *state)
int hostmixer_ioctl_mixdev_user(struct hostmixer_state *state,
unsigned int cmd, unsigned long arg)
{
- int ret;
#ifdef DEBUG
printk("hostmixer: ioctl_user called cmd = %u\n",cmd);
#endif
- ret = ioctl(state->fd, cmd, arg);
- if(ret < 0)
- return(-errno);
- return(ret);
+ return(os_ioctl_generic(state->fd, cmd, arg));
}
int hostmixer_open_mixdev_user(struct hostmixer_state *state, int r, int w,
@@ -115,12 +99,13 @@ int hostmixer_open_mixdev_user(struct hostmixer_state *state, int r, int w,
state->fd = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0);
- if(state->fd >= 0) return(0);
-
- printk("hostaudio_open_mixdev_user failed to open '%s', errno = %d\n",
- mixer, errno);
+ if(state->fd < 0) {
+ printk("hostaudio_open_mixdev_user failed to open '%s', "
+ "err = %d\n", mixer, state->fd);
+ return(state->fd);
+ }
- return(-errno);
+ return(0);
}
int hostmixer_release_mixdev_user(struct hostmixer_state *state)
@@ -130,7 +115,7 @@ int hostmixer_release_mixdev_user(struct hostmixer_state *state)
#endif
if(state->fd >= 0){
- close(state->fd);
+ os_close_file(state->fd);
state->fd = -1;
}
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c
index eefe7d6..6215013 100644
--- a/arch/um/drivers/line.c
+++ b/arch/um/drivers/line.c
@@ -551,7 +551,7 @@ static void winch_cleanup(void)
winch = list_entry(ele, struct winch, list);
if(winch->fd != -1){
deactivate_fd(winch->fd, WINCH_IRQ);
- close(winch->fd);
+ os_close_file(winch->fd);
}
if(winch->pid != -1)
os_kill_process(winch->pid, 1);
diff --git a/arch/um/drivers/mcast_user.c b/arch/um/drivers/mcast_user.c
index 58e5db6..0fe1d9f 100644
--- a/arch/um/drivers/mcast_user.c
+++ b/arch/um/drivers/mcast_user.c
@@ -23,6 +23,7 @@
#include "kern_util.h"
#include "user_util.h"
#include "user.h"
+#include "os.h"
#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER)
@@ -62,7 +63,8 @@ static int mcast_open(void *data)
goto out;
}
- if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (fd < 0){
printk("mcast_open : data socket failed, errno = %d\n",
errno);
fd = -ENOMEM;
@@ -72,7 +74,7 @@ static int mcast_open(void *data)
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
printk("mcast_open: SO_REUSEADDR failed, errno = %d\n",
errno);
- close(fd);
+ os_close_file(fd);
fd = -EINVAL;
goto out;
}
@@ -82,7 +84,7 @@ static int mcast_open(void *data)
sizeof(pri->ttl)) < 0) {
printk("mcast_open: IP_MULTICAST_TTL failed, error = %d\n",
errno);
- close(fd);
+ os_close_file(fd);
fd = -EINVAL;
goto out;
}
@@ -91,7 +93,7 @@ static int mcast_open(void *data)
if (setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &yes, sizeof(yes)) < 0) {
printk("mcast_open: IP_MULTICAST_LOOP failed, error = %d\n",
errno);
- close(fd);
+ os_close_file(fd);
fd = -EINVAL;
goto out;
}
@@ -99,7 +101,7 @@ static int mcast_open(void *data)
/* bind socket to mcast address */
if (bind(fd, (struct sockaddr *) sin, sizeof(*sin)) < 0) {
printk("mcast_open : data bind failed, errno = %d\n", errno);
- close(fd);
+ os_close_file(fd);
fd = -EINVAL;
goto out;
}
@@ -115,7 +117,7 @@ static int mcast_open(void *data)
"interface on the host.\n");
printk("eth0 should be configured in order to use the "
"multicast transport.\n");
- close(fd);
+ os_close_file(fd);
fd = -EINVAL;
}
@@ -137,7 +139,7 @@ static void mcast_close(int fd, void *data)
errno);
}
- close(fd);
+ os_close_file(fd);
}
int mcast_user_write(int fd, void *buf, int len, struct mcast_data *pri)
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
index 4f6daaa..4e92885 100644
--- a/arch/um/drivers/mconsole_kern.c
+++ b/arch/um/drivers/mconsole_kern.c
@@ -408,7 +408,7 @@ int mconsole_init(void)
if(umid_file_name("mconsole", file, sizeof(file))) return(-1);
snprintf(mconsole_socket_name, sizeof(file), "%s", file);
- sock = create_unix_socket(file, sizeof(file), 1);
+ sock = os_create_unix_socket(file, sizeof(file), 1);
if (sock < 0){
printk("Failed to initialize management console\n");
return(1);
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c
index f5c1a6c..a419da0 100644
--- a/arch/um/drivers/net_kern.c
+++ b/arch/um/drivers/net_kern.c
@@ -38,7 +38,8 @@ static int uml_net_rx(struct net_device *dev)
struct sk_buff *skb;
/* If we can't allocate memory, try again next round. */
- if ((skb = dev_alloc_skb(dev->mtu)) == NULL) {
+ skb = dev_alloc_skb(dev->mtu);
+ if (skb == NULL) {
lp->stats.rx_dropped++;
return 0;
}
diff --git a/arch/um/drivers/net_user.c b/arch/um/drivers/net_user.c
index 75a83e9..c9fc286 100644
--- a/arch/um/drivers/net_user.c
+++ b/arch/um/drivers/net_user.c
@@ -26,8 +26,7 @@ int tap_open_common(void *dev, char *gate_addr)
if(gate_addr == NULL) return(0);
if(sscanf(gate_addr, "%d.%d.%d.%d", &tap_addr[0],
&tap_addr[1], &tap_addr[2], &tap_addr[3]) != 4){
- printk("Invalid tap IP address - '%s'\n",
- gate_addr);
+ printk("Invalid tap IP address - '%s'\n", gate_addr);
return(-EINVAL);
}
return(0);
@@ -60,18 +59,18 @@ void read_output(int fd, char *output, int len)
}
*output = '\0';
- if(read(fd, &remain, sizeof(remain)) != sizeof(remain)){
- printk("read_output - read of length failed, errno = %d\n",
- errno);
+ n = os_read_file(fd, &remain, sizeof(remain));
+ if(n != sizeof(remain)){
+ printk("read_output - read of length failed, err = %d\n", -n);
return;
}
while(remain != 0){
n = (remain < len) ? remain : len;
- actual = read(fd, output, n);
+ actual = os_read_file(fd, output, n);
if(actual != n){
printk("read_output - read of data failed, "
- "errno = %d\n", errno);
+ "err = %d\n", -actual);
return;
}
remain -= actual;
@@ -83,13 +82,12 @@ int net_read(int fd, void *buf, int len)
{
int n;
- while(((n = read(fd, buf, len)) < 0) && (errno == EINTR)) ;
+ n = os_read_file(fd, buf, len);
- if(n < 0){
- if(errno == EAGAIN) return(0);
- return(-errno);
- }
- else if(n == 0) return(-ENOTCONN);
+ if(n == -EAGAIN)
+ return(0);
+ else if(n == 0)
+ return(-ENOTCONN);
return(n);
}
@@ -112,13 +110,13 @@ int net_write(int fd, void *buf, int len)
{
int n;
- while(((n = write(fd, buf, len)) < 0) && (errno == EINTR)) ;
- if(n < 0){
- if(errno == EAGAIN) return(0);
- return(-errno);
- }
- else if(n == 0) return(-ENOTCONN);
- return(n);
+ n = os_write_file(fd, buf, len);
+
+ if(n == -EAGAIN)
+ return(0);
+ else if(n == 0)
+ return(-ENOTCONN);
+ return(n);
}
int net_send(int fd, void *buf, int len)
@@ -157,7 +155,7 @@ static void change_pre_exec(void *arg)
{
struct change_pre_exec_data *data = arg;
- close(data->close_me);
+ os_close_file(data->close_me);
dup2(data->stdout, 1);
}
@@ -167,15 +165,15 @@ static int change_tramp(char **argv, char *output, int output_len)
struct change_pre_exec_data pe_data;
err = os_pipe(fds, 1, 0);
- if(err){
- printk("change_tramp - pipe failed, errno = %d\n", -err);
+ if(err < 0){
+ printk("change_tramp - pipe failed, err = %d\n", -err);
return(err);
}
pe_data.close_me = fds[0];
pe_data.stdout = fds[1];
pid = run_helper(change_pre_exec, &pe_data, argv, NULL);
- close(fds[1]);
+ os_close_file(fds[1]);
read_output(fds[0], output, output_len);
waitpid(pid, NULL, 0);
return(pid);
diff --git a/arch/um/drivers/null.c b/arch/um/drivers/null.c
index d361554..66b2fbe 100644
--- a/arch/um/drivers/null.c
+++ b/arch/um/drivers/null.c
@@ -5,7 +5,6 @@
#include <stdlib.h>
#include <errno.h>
-#include <fcntl.h>
#include "chan_user.h"
#include "os.h"
diff --git a/arch/um/drivers/port_kern.c b/arch/um/drivers/port_kern.c
index 627def7..3940899 100644
--- a/arch/um/drivers/port_kern.c
+++ b/arch/um/drivers/port_kern.c
@@ -55,7 +55,7 @@ static void pipe_interrupt(int irq, void *data, struct pt_regs *regs)
if(fd == -EAGAIN)
return;
- printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n",
+ printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n",
-fd);
os_close_file(conn->fd);
}
diff --git a/arch/um/drivers/port_user.c b/arch/um/drivers/port_user.c
index 7a37cf6..8dbad94 100644
--- a/arch/um/drivers/port_user.c
+++ b/arch/um/drivers/port_user.c
@@ -47,10 +47,12 @@ void *port_init(char *str, int device, struct chan_opts *opts)
return(NULL);
}
- if((kern_data = port_data(port)) == NULL)
+ kern_data = port_data(port);
+ if(kern_data == NULL)
return(NULL);
- if((data = um_kmalloc(sizeof(*data))) == NULL)
+ data = um_kmalloc(sizeof(*data));
+ if(data == NULL)
goto err;
*data = ((struct port_chan) { .raw = opts->raw,
@@ -90,7 +92,7 @@ void port_close(int fd, void *d)
struct port_chan *data = d;
port_remove_dev(data->kernel_data);
- close(fd);
+ os_close_file(fd);
}
int port_console_write(int fd, const char *buf, int n, void *d)
@@ -130,11 +132,15 @@ int port_listen_fd(int port)
goto out;
}
- if((listen(fd, 1) < 0) || (os_set_fd_block(fd, 0))){
+ if(listen(fd, 1) < 0){
err = -errno;
goto out;
}
+ err = os_set_fd_block(fd, 0);
+ if(err < 0)
+ goto out;
+
return(fd);
out:
os_close_file(fd);
@@ -153,10 +159,10 @@ void port_pre_exec(void *arg)
dup2(data->sock_fd, 0);
dup2(data->sock_fd, 1);
dup2(data->sock_fd, 2);
- close(data->sock_fd);
+ os_close_file(data->sock_fd);
dup2(data->pipe_fd, 3);
os_shutdown_socket(3, 1, 0);
- close(data->pipe_fd);
+ os_close_file(data->pipe_fd);
}
int port_connection(int fd, int *socket, int *pid_out)
@@ -166,11 +172,12 @@ int port_connection(int fd, int *socket, int *pid_out)
"/usr/lib/uml/port-helper", NULL };
struct port_pre_exec_data data;
- if((new = os_accept_connection(fd)) < 0)
- return(-errno);
+ new = os_accept_connection(fd);
+ if(new < 0)
+ return(new);
err = os_pipe(socket, 0, 0);
- if(err)
+ if(err < 0)
goto out_close;
data = ((struct port_pre_exec_data)
@@ -186,11 +193,11 @@ int port_connection(int fd, int *socket, int *pid_out)
out_shutdown:
os_shutdown_socket(socket[0], 1, 1);
- close(socket[0]);
+ os_close_file(socket[0]);
os_shutdown_socket(socket[1], 1, 1);
- close(socket[1]);
+ os_close_file(socket[1]);
out_close:
- close(new);
+ os_close_file(new);
return(err);
}
diff --git a/arch/um/drivers/pty.c b/arch/um/drivers/pty.c
index 0274053..bd6216a 100644
--- a/arch/um/drivers/pty.c
+++ b/arch/um/drivers/pty.c
@@ -7,12 +7,12 @@
#include <unistd.h>
#include <string.h>
#include <errno.h>
-#include <fcntl.h>
#include <termios.h>
#include "chan_user.h"
#include "user.h"
#include "user_util.h"
#include "kern_util.h"
+#include "os.h"
struct pty_chan {
void (*announce)(char *dev_name, int dev);
@@ -26,7 +26,8 @@ void *pty_chan_init(char *str, int device, struct chan_opts *opts)
{
struct pty_chan *data;
- if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL);
+ data = um_kmalloc(sizeof(*data));
+ if(data == NULL) return(NULL);
*data = ((struct pty_chan) { .announce = opts->announce,
.dev = device,
.raw = opts->raw });
@@ -39,7 +40,8 @@ int pts_open(int input, int output, int primary, void *d, char **dev_out)
char *dev;
int fd;
- if((fd = get_pty()) < 0){
+ fd = get_pty();
+ if(fd < 0){
printk("open_pts : Failed to open pts\n");
return(-errno);
}
@@ -57,29 +59,28 @@ int pts_open(int input, int output, int primary, void *d, char **dev_out)
int getmaster(char *line)
{
- struct stat stb;
+ struct uml_stat stb;
char *pty, *bank, *cp;
- int master;
+ int master, err;
pty = &line[strlen("/dev/ptyp")];
for (bank = "pqrs"; *bank; bank++) {
line[strlen("/dev/pty")] = *bank;
*pty = '0';
- if (stat(line, &stb) < 0)
+ if (os_stat_file(line, &stb) < 0)
break;
for (cp = "0123456789abcdef"; *cp; cp++) {
*pty = *cp;
- master = open(line, O_RDWR);
+ master = os_open_file(line, of_rdwr(OPENFLAGS()), 0);
if (master >= 0) {
char *tp = &line[strlen("/dev/")];
- int ok;
/* verify slave side is usable */
*tp = 't';
- ok = access(line, R_OK|W_OK) == 0;
+ err = os_access(line, OS_ACC_RW_OK);
*tp = 'p';
- if (ok) return(master);
- (void) close(master);
+ if(err == 0) return(master);
+ (void) os_close_file(master);
}
}
}
diff --git a/arch/um/drivers/slip_user.c b/arch/um/drivers/slip_user.c
index 782cf52..1a52559 100644
--- a/arch/um/drivers/slip_user.c
+++ b/arch/um/drivers/slip_user.c
@@ -4,11 +4,9 @@
#include <stddef.h>
#include <sched.h>
#include <string.h>
-#include <sys/fcntl.h>
#include <sys/errno.h>
#include <sys/termios.h>
#include <sys/wait.h>
-#include <sys/ioctl.h>
#include <sys/signal.h>
#include "user_util.h"
#include "kern_util.h"
@@ -65,9 +63,9 @@ static void slip_pre_exec(void *arg)
{
struct slip_pre_exec_data *data = arg;
- if(data->stdin != -1) dup2(data->stdin, 0);
+ if(data->stdin >= 0) dup2(data->stdin, 0);
dup2(data->stdout, 1);
- if(data->close_me != -1) close(data->close_me);
+ if(data->close_me >= 0) os_close_file(data->close_me);
}
static int slip_tramp(char **argv, int fd)
@@ -77,8 +75,8 @@ static int slip_tramp(char **argv, int fd)
int status, pid, fds[2], err, output_len;
err = os_pipe(fds, 1, 0);
- if(err){
- printk("slip_tramp : pipe failed, errno = %d\n", -err);
+ if(err < 0){
+ printk("slip_tramp : pipe failed, err = %d\n", -err);
return(err);
}
@@ -96,7 +94,7 @@ static int slip_tramp(char **argv, int fd)
printk("slip_tramp : failed to allocate output "
"buffer\n");
- close(fds[1]);
+ os_close_file(fds[1]);
read_output(fds[0], output, output_len);
if(output != NULL){
printk("%s", output);
@@ -105,7 +103,7 @@ static int slip_tramp(char **argv, int fd)
if(waitpid(pid, &status, 0) < 0) err = errno;
else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)){
printk("'%s' didn't exit with status 0\n", argv[0]);
- err = EINVAL;
+ err = -EINVAL;
}
}
return(err);
@@ -118,15 +116,17 @@ static int slip_open(void *data)
char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")];
char *argv[] = { "uml_net", version_buf, "slip", "up", gate_buf,
NULL };
- int sfd, mfd, disc, sencap, err;
+ int sfd, mfd, err;
- if((mfd = get_pty()) < 0){
- printk("umn : Failed to open pty\n");
- return(-1);
+ mfd = get_pty();
+ if(mfd < 0){
+ printk("umn : Failed to open pty, err = %d\n", -mfd);
+ return(mfd);
}
- if((sfd = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0)) < 0){
- printk("Couldn't open tty for slip line\n");
- return(-1);
+ sfd = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0);
+ if(sfd < 0){
+ printk("Couldn't open tty for slip line, err = %d\n", -sfd);
+ return(sfd);
}
if(set_up_tty(sfd)) return(-1);
pri->slave = sfd;
@@ -138,28 +138,23 @@ static int slip_open(void *data)
err = slip_tramp(argv, sfd);
- if(err != 0){
- printk("slip_tramp failed - errno = %d\n", err);
- return(-err);
+ if(err < 0){
+ printk("slip_tramp failed - err = %d\n", -err);
+ return(err);
}
- if(ioctl(pri->slave, SIOCGIFNAME, pri->name) < 0){
- printk("SIOCGIFNAME failed, errno = %d\n", errno);
- return(-errno);
+ err = os_get_ifname(pri->slave, pri->name);
+ if(err < 0){
+ printk("get_ifname failed, err = %d\n", -err);
+ return(err);
}
iter_addresses(pri->dev, open_addr, pri->name);
}
else {
- disc = N_SLIP;
- if(ioctl(sfd, TIOCSETD, &disc) < 0){
- printk("Failed to set slip line discipline - "
- "errno = %d\n", errno);
- return(-errno);
- }
- sencap = 0;
- if(ioctl(sfd, SIOCSIFENCAP, &sencap) < 0){
- printk("Failed to set slip encapsulation - "
- "errno = %d\n", errno);
- return(-errno);
+ err = os_set_slip(sfd);
+ if(err < 0){
+ printk("Failed to set slip discipline encapsulation - "
+ "err = %d\n", -err);
+ return(err);
}
}
return(mfd);
@@ -181,9 +176,9 @@ static void slip_close(int fd, void *data)
err = slip_tramp(argv, -1);
if(err != 0)
- printk("slip_tramp failed - errno = %d\n", err);
- close(fd);
- close(pri->slave);
+ printk("slip_tramp failed - errno = %d\n", -err);
+ os_close_file(fd);
+ os_close_file(pri->slave);
pri->slave = -1;
}
@@ -243,7 +238,7 @@ static void slip_add_addr(unsigned char *addr, unsigned char *netmask,
{
struct slip_data *pri = data;
- if(pri->slave == -1) return;
+ if(pri->slave < 0) return;
open_addr(addr, netmask, pri->name);
}
@@ -252,7 +247,7 @@ static void slip_del_addr(unsigned char *addr, unsigned char *netmask,
{
struct slip_data *pri = data;
- if(pri->slave == -1) return;
+ if(pri->slave < 0) return;
close_addr(addr, netmask, pri->name);
}
diff --git a/arch/um/drivers/slirp_user.c b/arch/um/drivers/slirp_user.c
index cbdbb65..edb45d9 100644
--- a/arch/um/drivers/slirp_user.c
+++ b/arch/um/drivers/slirp_user.c
@@ -4,7 +4,6 @@
#include <stddef.h>
#include <sched.h>
#include <string.h>
-#include <sys/fcntl.h>
#include <sys/errno.h>
#include <sys/wait.h>
#include <sys/signal.h>
@@ -48,15 +47,15 @@ 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){
- printk("slirp_datachan: Failed to open pipe, errno = %d\n",
- -err);
+ if(err < 0){
+ printk("slirp_datachan: Failed to open pipe, err = %d\n", -err);
return(err);
}
@@ -77,7 +76,7 @@ static int slirp_open(void *data)
pid = slirp_tramp(pri->argw.argv, sfd);
if(pid < 0){
- printk("slirp_tramp failed - errno = %d\n", pid);
+ printk("slirp_tramp failed - errno = %d\n", -pid);
os_close_file(sfd);
os_close_file(mfd);
return(pid);
@@ -97,8 +96,8 @@ static void slirp_close(int fd, void *data)
struct slirp_data *pri = data;
int status,err;
- close(fd);
- close(pri->slave);
+ os_close_file(fd);
+ os_close_file(pri->slave);
pri->slave = -1;
diff --git a/arch/um/drivers/tty.c b/arch/um/drivers/tty.c
index e9eb9e3..b3676e9 100644
--- a/arch/um/drivers/tty.c
+++ b/arch/um/drivers/tty.c
@@ -5,7 +5,6 @@
#include <stdio.h>
#include <termios.h>
-#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include "chan_user.h"
@@ -30,7 +29,8 @@ void *tty_chan_init(char *str, int device, struct chan_opts *opts)
}
str++;
- if((data = um_kmalloc(sizeof(*data))) == NULL)
+ data = um_kmalloc(sizeof(*data));
+ if(data == NULL)
return(NULL);
*data = ((struct tty_chan) { .dev = str,
.raw = opts->raw });
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index de6df0a..2184804 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -458,7 +458,7 @@ static void ubd_handler(void)
n = read_ubd_fs(thread_fd, &req, sizeof(req));
if(n != sizeof(req)){
printk(KERN_ERR "Pid %d - spurious interrupt in ubd_handler, "
- "errno = %d\n", os_getpid(), -n);
+ "err = %d\n", os_getpid(), -n);
spin_lock(&io_request_lock);
end_request(0);
spin_unlock(&io_request_lock);
@@ -475,7 +475,7 @@ static void ubd_handler(void)
req.map_offset, 1);
if(err)
printk("ubd_handler - physmem_subst_mapping failed, "
- "err = %d\n", err);
+ "err = %d\n", -err);
}
spin_lock(&io_request_lock);
@@ -691,7 +691,7 @@ int ubd_init(void)
else if (err){
/* not auto so normal error */
printk(KERN_ERR "ubd: error %d getting major %d\n",
- err, fake_major);
+ -err, fake_major);
return(-ENODEV);
}
@@ -714,6 +714,7 @@ int ubd_init(void)
io_pid = start_io_thread(stack + PAGE_SIZE - sizeof(void *),
&thread_fd);
if(io_pid < 0){
+ io_pid = -1;
printk(KERN_ERR
"ubd : Failed to start I/O thread (errno = %d) - "
"falling back to synchronous I/O\n", -io_pid);
@@ -721,8 +722,8 @@ int ubd_init(void)
}
err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr,
SA_INTERRUPT, "ubd", ubd_dev);
- if(err != 0) printk(KERN_ERR
- "um_request_irq failed - errno = %d\n", -err);
+ if(err != 0)
+ printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err);
return(err);
}
@@ -778,7 +779,7 @@ static int ubd_open_dev(struct ubd *dev)
err = read_cow_bitmap(dev->fd, dev->cow.bitmap,
dev->cow.bitmap_offset,
dev->cow.bitmap_len);
- if(err) goto error;
+ if(err < 0) goto error;
flags = dev->openflags;
flags.w = 0;
@@ -822,7 +823,7 @@ static int ubd_open(struct inode *inode, struct file *filp)
goto out;
}
err = ubd_file_size(dev, &dev->size);
- if(err)
+ if(err < 0)
goto out;
sizes[offset] = dev->size / BLOCK_SIZE;
ubd_part[offset].nr_sects = dev->size / hardsect_sizes[offset];
@@ -973,7 +974,8 @@ static int prepare_mmap_request(struct ubd *dev, int fd, __u64 offset,
err = physmem_subst_mapping(req->buffer, fd, offset, w);
if(err){
- printk("physmem_subst_mapping failed, err = %d\n", err);
+ printk("physmem_subst_mapping failed, err = %d\n",
+ -err);
return(1);
}
dev->map_reads++;
@@ -1198,7 +1200,7 @@ static int ubd_revalidate1(kdev_t rdev)
/* have to recompute sizes since we opened it */
err = ubd_file_size(dev, &dev->size);
- if(err) {
+ if(err < 0) {
ubd_close(dev);
goto out;
}
@@ -1279,15 +1281,15 @@ static int ubd_check_remapped(int fd, unsigned long address, int is_write,
*/
err = os_seek_file(dev->fd, offset + dev->cow.data_offset);
- if(err)
+ if(err < 0)
panic("Couldn't seek to %lld in COW file of ubd "
- "device %d, errno = %d",
+ "device %d, err = %d",
offset + dev->cow.data_offset, i, -err);
- err = os_write_file(dev->fd, (void *) address, PAGE_SIZE);
- if(err != PAGE_SIZE)
+ n = os_write_file(dev->fd, (void *) address, PAGE_SIZE);
+ if(n != PAGE_SIZE)
panic("Couldn't copy data to COW file of ubd "
- "device %d, errno = %d", i, -err);
+ "device %d, err = %d", i, -n);
/* ... updating the COW bitmap... */
@@ -1296,14 +1298,14 @@ static int ubd_check_remapped(int fd, unsigned long address, int is_write,
new_bitmap);
err = os_seek_file(dev->fd, bitmap_offset);
- if(err)
+ if(err < 0)
panic("Couldn't seek to %lld in COW file of ubd "
- "device %d, errno = %d", bitmap_offset, i, -err);
+ "device %d, err = %d", bitmap_offset, i, -err);
- err = os_write_file(dev->fd, new_bitmap, sizeof(new_bitmap));
- if(err != sizeof(new_bitmap))
+ n = os_write_file(dev->fd, new_bitmap, sizeof(new_bitmap));
+ if(n != sizeof(new_bitmap))
panic("Couldn't update bitmap of ubd device %d, "
- "errno = %d", i, -err);
+ "err = %d", i, -n);
/* Maybe we can map the COW page in, and maybe we can't. If
* it is a pre-V3 COW file, we can't, since the alignment will
@@ -1327,16 +1329,16 @@ static int ubd_check_remapped(int fd, unsigned long address, int is_write,
offset, 1);
else {
err = os_seek_file(dev->fd, offset);
- if(err)
+ if(err < 0)
panic("Couldn't seek to %lld in COW file of "
- "ubd device %d, errno = %d", offset, i,
+ "ubd device %d, err = %d", offset, i,
-err);
n = os_read_file(dev->fd, (void *) address, PAGE_SIZE);
if(n != PAGE_SIZE)
panic("Failed to read page from offset %llx of "
- "COW file of ubd device %d, errno = %d",
- offset, i, -err);
+ "COW file of ubd device %d, err = %d",
+ offset, i, -n);
}
return(1);
diff --git a/arch/um/drivers/ubd_user.c b/arch/um/drivers/ubd_user.c
index 670f0bd..166ad6f 100644
--- a/arch/um/drivers/ubd_user.c
+++ b/arch/um/drivers/ubd_user.c
@@ -11,9 +11,7 @@
#include <signal.h>
#include <string.h>
#include <netinet/in.h>
-#include <sys/stat.h>
#include <sys/time.h>
-#include <sys/fcntl.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/mman.h>
@@ -31,18 +29,20 @@
static int same_backing_files(char *from_cmdline, char *from_cow, char *cow)
{
- struct stat64 buf1, buf2;
+ struct uml_stat buf1, buf2;
+ int err;
if(from_cmdline == NULL) return(1);
if(!strcmp(from_cmdline, from_cow)) return(1);
- if(stat64(from_cmdline, &buf1) < 0){
- printk("Couldn't stat '%s', errno = %d\n", from_cmdline,
- errno);
+ err = os_stat_file(from_cmdline, &buf1);
+ if(err < 0){
+ printk("Couldn't stat '%s', err = %d\n", from_cmdline, -err);
return(1);
}
- if(stat64(from_cow, &buf2) < 0){
- printk("Couldn't stat '%s', errno = %d\n", from_cow, errno);
+ err = os_stat_file(from_cow, &buf2);
+ if(err < 0){
+ printk("Couldn't stat '%s', err = %d\n", from_cow, -err);
return(1);
}
if((buf1.st_dev == buf2.st_dev) && (buf1.st_ino == buf2.st_ino))
@@ -56,20 +56,21 @@ static int same_backing_files(char *from_cmdline, char *from_cow, char *cow)
static int backing_file_mismatch(char *file, __u64 size, time_t mtime)
{
- struct stat64 buf;
+ struct uml_stat buf;
long long actual;
int err;
- if(stat64(file, &buf) < 0){
- printk("Failed to stat backing file \"%s\", errno = %d\n",
- file, errno);
- return(-errno);
+ err = os_stat_file(file, &buf);
+ if(err < 0){
+ printk("Failed to stat backing file \"%s\", err = %d\n",
+ file, -err);
+ return(err);
}
err = os_file_size(file, &actual);
- if(err){
+ if(err < 0){
printk("Failed to get size of backing file \"%s\", "
- "errno = %d\n", file, -err);
+ "err = %d\n", file, -err);
return(err);
}
@@ -91,9 +92,13 @@ int read_cow_bitmap(int fd, void *buf, int offset, int len)
int err;
err = os_seek_file(fd, offset);
- if(err != 0) return(-errno);
- err = read(fd, buf, len);
- if(err < 0) return(-errno);
+ if(err < 0)
+ return(err);
+
+ err = os_read_file(fd, buf, len);
+ if(err < 0)
+ return(err);
+
return(0);
}
@@ -108,19 +113,21 @@ int open_ubd_file(char *file, struct openflags *openflags,
char *backing_file;
int fd, err, sectorsize, same, mode = 0644;
- if((fd = os_open_file(file, *openflags, mode)) < 0){
+ fd = os_open_file(file, *openflags, mode);
+ if(fd < 0){
if((fd == -ENOENT) && (create_cow_out != NULL))
*create_cow_out = 1;
if(!openflags->w ||
((errno != EROFS) && (errno != EACCES))) return(-errno);
openflags->w = 0;
- if((fd = os_open_file(file, *openflags, mode)) < 0)
+ fd = os_open_file(file, *openflags, mode);
+ if(fd < 0)
return(fd);
}
err = os_lock_file(fd, openflags->w);
- if(err){
- printk("Failed to lock '%s', errno = %d\n", file, -err);
+ if(err < 0){
+ printk("Failed to lock '%s', err = %d\n", file, -err);
goto out_close;
}
@@ -130,7 +137,7 @@ int open_ubd_file(char *file, struct openflags *openflags,
&size, &sectorsize, &align, bitmap_offset_out);
if(err && (*backing_file_out != NULL)){
printk("Failed to read COW header from COW file \"%s\", "
- "errno = %d\n", file, err);
+ "errno = %d\n", file, -err);
goto out_close;
}
if(err) return(fd);
@@ -144,7 +151,7 @@ int open_ubd_file(char *file, struct openflags *openflags,
err = write_cow_header(file, fd, *backing_file_out,
sectorsize, align, &size);
if(err){
- printk("Switch failed, errno = %d\n", err);
+ printk("Switch failed, errno = %d\n", -err);
return(err);
}
}
@@ -189,22 +196,15 @@ int create_cow_file(char *cow_file, char *backing_file, struct openflags flags,
return(err);
}
+/* XXX Just trivial wrappers around os_read_file and os_write_file */
int read_ubd_fs(int fd, void *buffer, int len)
{
- int n;
-
- n = read(fd, buffer, len);
- if(n < 0) return(-errno);
- else return(n);
+ return(os_read_file(fd, buffer, len));
}
int write_ubd_fs(int fd, char *buffer, int len)
{
- int n;
-
- n = write(fd, buffer, len);
- if(n < 0) return(-errno);
- else return(n);
+ return(os_write_file(fd, buffer, len));
}
static int update_bitmap(struct io_thread_req *req)
@@ -214,15 +214,17 @@ static int update_bitmap(struct io_thread_req *req)
if(req->cow_offset == -1)
return(0);
- if(os_seek_file(req->fds[1], req->cow_offset) != 0){
- printk("do_io - bitmap lseek failed : errno = %d\n", errno);
+ n = os_seek_file(req->fds[1], req->cow_offset);
+ if(n < 0){
+ printk("do_io - bitmap lseek failed : err = %d\n", -n);
return(1);
}
- n = write(req->fds[1], &req->bitmap_words, sizeof(req->bitmap_words));
+ n = os_write_file(req->fds[1], &req->bitmap_words,
+ sizeof(req->bitmap_words));
if(n != sizeof(req->bitmap_words)){
- printk("do_io - bitmap update returned %d : errno = %d "
- "fd = %d\n", n, errno, req->fds[1]);
+ printk("do_io - bitmap update failed, err = %d fd = %d\n", -n,
+ req->fds[1]);
return(1);
}
@@ -234,10 +236,14 @@ void do_io(struct io_thread_req *req)
char *buf;
unsigned long len;
int n, nsectors, start, end, bit;
+ int err;
__u64 off;
if(req->op == UBD_MMAP){
- n = *((int *) req->buffer);
+ /* Touch the page to force the host to do any necessary IO to
+ * get it into memory
+ */
+ n = *((int *) req->buffer);
req->error = update_bitmap(req);
return;
}
@@ -257,8 +263,9 @@ void do_io(struct io_thread_req *req)
len = (end - start) * req->sectorsize;
buf = &req->buffer[start * req->sectorsize];
- if(os_seek_file(req->fds[bit], off) != 0){
- printk("do_io - lseek failed : errno = %d\n", errno);
+ err = os_seek_file(req->fds[bit], off);
+ if(err < 0){
+ printk("do_io - lseek failed : err = %d\n", -err);
req->error = 1;
return;
}
@@ -267,11 +274,10 @@ void do_io(struct io_thread_req *req)
do {
buf = &buf[n];
len -= n;
- n = read(req->fds[bit], buf, len);
+ n = os_read_file(req->fds[bit], buf, len);
if (n < 0) {
- printk("do_io - read returned %d : "
- "errno = %d fd = %d\n", n,
- errno, req->fds[bit]);
+ printk("do_io - read failed, err = %d "
+ "fd = %d\n", -n, req->fds[bit]);
req->error = 1;
return;
}
@@ -279,11 +285,10 @@ void do_io(struct io_thread_req *req)
if (n < len) memset(&buf[n], 0, len - n);
}
else {
- n = write(req->fds[bit], buf, len);
+ n = os_write_file(req->fds[bit], buf, len);
if(n != len){
- printk("do_io - write returned %d : "
- "errno = %d fd = %d\n", n,
- errno, req->fds[bit]);
+ printk("do_io - write failed err = %d "
+ "fd = %d\n", -n, req->fds[bit]);
req->error = 1;
return;
}
@@ -310,19 +315,23 @@ int io_thread(void *arg)
signal(SIGWINCH, SIG_IGN);
while(1){
- n = read(kernel_fd, &req, sizeof(req));
- if(n < 0) printk("io_thread - read returned %d, errno = %d\n",
- n, errno);
- else if(n < sizeof(req)){
- printk("io_thread - short read : length = %d\n", n);
- continue;
+ n = os_read_file(kernel_fd, &req, sizeof(req));
+ if(n != sizeof(req)){
+ if(n < 0) {
+ printk("io_thread - read failed, err = %d\n",
+ -n);
+ }
+ else {
+ printk("io_thread - short read : length = %d\n",
+ n);
+ continue;
+ }
}
io_count++;
do_io(&req);
- n = write(kernel_fd, &req, sizeof(req));
+ n = os_write_file(kernel_fd, &req, sizeof(req));
if(n != sizeof(req))
- printk("io_thread - write failed, errno = %d\n",
- errno);
+ printk("io_thread - write failed, err = %d\n", -n);
}
}
@@ -331,20 +340,26 @@ int start_io_thread(unsigned long sp, int *fd_out)
int pid, fds[2], err;
err = os_pipe(fds, 1, 1);
- if(err){
- printk("start_io_thread - os_pipe failed, errno = %d\n", -err);
- return(-1);
+ if(err < 0){
+ printk("start_io_thread - os_pipe failed, err = %d\n", -err);
+ return(err);
}
- kernel_fd = fds[0];
- *fd_out = fds[1];
pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM | SIGCHLD,
NULL);
if(pid < 0){
printk("start_io_thread - clone failed : errno = %d\n", errno);
- return(-errno);
+ goto err;
}
+
+ kernel_fd = fds[0];
+ *fd_out = fds[1];
+
return(pid);
+ err:
+ os_close_file(fds[0]);
+ os_close_file(fds[1]);
+ return(-errno);
}
/*
diff --git a/arch/um/drivers/xterm.c b/arch/um/drivers/xterm.c
index ad26b27..dccdf3e 100644
--- a/arch/um/drivers/xterm.c
+++ b/arch/um/drivers/xterm.c
@@ -8,7 +8,6 @@
#include <unistd.h>
#include <string.h>
#include <errno.h>
-#include <fcntl.h>
#include <termios.h>
#include <signal.h>
#include <sched.h>
@@ -36,7 +35,8 @@ void *xterm_init(char *str, int device, struct chan_opts *opts)
{
struct xterm_chan *data;
- if((data = malloc(sizeof(*data))) == NULL) return(NULL);
+ data = malloc(sizeof(*data));
+ if(data == NULL) return(NULL);
*data = ((struct xterm_chan) { .pid = -1,
.helper_pid = -1,
.device = device,
@@ -93,7 +93,7 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
"/usr/lib/uml/port-helper", "-uml-socket",
file, NULL };
- if(access(argv[4], X_OK))
+ if(os_access(argv[4], OS_ACC_X_OK) < 0)
argv[4] = "port-helper";
fd = mkstemp(file);
@@ -106,13 +106,13 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
printk("xterm_open : unlink failed, errno = %d\n", errno);
return(-errno);
}
- close(fd);
+ os_close_file(fd);
- fd = create_unix_socket(file, sizeof(file), 1);
+ fd = os_create_unix_socket(file, sizeof(file), 1);
if(fd < 0){
printk("xterm_open : create_unix_socket failed, errno = %d\n",
-fd);
- return(-fd);
+ return(fd);
}
sprintf(title, data->title, data->device);
@@ -128,15 +128,16 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
if(data->direct_rcv)
new = os_rcv_fd(fd, &data->helper_pid);
else {
- if((err = os_set_fd_block(fd, 0)) != 0){
+ err = os_set_fd_block(fd, 0);
+ if(err < 0){
printk("xterm_open : failed to set descriptor "
- "non-blocking, errno = %d\n", err);
+ "non-blocking, err = %d\n", -err);
return(err);
}
new = xterm_fd(fd, &data->helper_pid);
}
if(new < 0){
- printk("xterm_open : os_rcv_fd failed, errno = %d\n", -new);
+ printk("xterm_open : os_rcv_fd failed, err = %d\n", -new);
goto out;
}
@@ -160,7 +161,7 @@ void xterm_close(int fd, void *d)
if(data->helper_pid != -1)
os_kill_process(data->helper_pid, 0);
data->helper_pid = -1;
- close(fd);
+ os_close_file(fd);
}
void xterm_free(void *d)
diff --git a/arch/um/fs/hostfs/hostfs_kern.c b/arch/um/fs/hostfs/hostfs_kern.c
index c5cf93e..0dbe3cc 100644
--- a/arch/um/fs/hostfs/hostfs_kern.c
+++ b/arch/um/fs/hostfs/hostfs_kern.c
@@ -611,7 +611,8 @@ int hostfs_link(struct dentry *to, struct inode *ino, struct dentry *from)
char *from_name, *to_name;
int err;
- if((from_name = inode_dentry_name(ino, from)) == NULL)
+ from_name = inode_dentry_name(ino, from);
+ if(from_name == NULL)
return(-ENOMEM);
to_name = dentry_name(to, 0);
if(to_name == NULL){
@@ -629,7 +630,8 @@ int hostfs_unlink(struct inode *ino, struct dentry *dentry)
char *file;
int err;
- if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM);
+ file = inode_dentry_name(ino, dentry);
+ if(file == NULL) return(-ENOMEM);
if(append)
return(-EPERM);
@@ -643,7 +645,8 @@ int hostfs_symlink(struct inode *ino, struct dentry *dentry, const char *to)
char *file;
int err;
- if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM);
+ file = inode_dentry_name(ino, dentry);
+ if(file == NULL) return(-ENOMEM);
err = make_symlink(file, to);
kfree(file);
return(err);
@@ -654,7 +657,8 @@ int hostfs_mkdir(struct inode *ino, struct dentry *dentry, int mode)
char *file;
int err;
- if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM);
+ file = inode_dentry_name(ino, dentry);
+ if(file == NULL) return(-ENOMEM);
err = do_mkdir(file, mode);
kfree(file);
return(err);
@@ -665,7 +669,8 @@ int hostfs_rmdir(struct inode *ino, struct dentry *dentry)
char *file;
int err;
- if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM);
+ file = inode_dentry_name(ino, dentry);
+ if(file == NULL) return(-ENOMEM);
err = do_rmdir(file);
kfree(file);
return(err);
@@ -702,9 +707,11 @@ int hostfs_rename(struct inode *from_ino, struct dentry *from,
char *from_name, *to_name;
int err;
- if((from_name = inode_dentry_name(from_ino, from)) == NULL)
+ from_name = inode_dentry_name(from_ino, from);
+ if(from_name == NULL)
return(-ENOMEM);
- if((to_name = inode_dentry_name(to_ino, to)) == NULL){
+ to_name = inode_dentry_name(to_ino, to);
+ if(to_name == NULL){
kfree(from_name);
return(-ENOMEM);
}
diff --git a/arch/um/fs/hppfs/hppfs_kern.c b/arch/um/fs/hppfs/hppfs_kern.c
index 2925495..13d2234 100644
--- a/arch/um/fs/hppfs/hppfs_kern.c
+++ b/arch/um/fs/hppfs/hppfs_kern.c
@@ -114,7 +114,7 @@ static int file_removed(struct dentry *dentry, const char *file)
fd = os_open_file(host_file, of_read(OPENFLAGS()), 0);
kfree(host_file);
- if(fd > 0){
+ if(fd >= 0){
os_close_file(fd);
return(1);
}
@@ -190,8 +190,7 @@ static ssize_t hppfs_read_file(int fd, char *buf, ssize_t count)
cur = min_t(ssize_t, count, PAGE_SIZE);
err = os_read_file(fd, new_buf, cur);
if(err < 0){
- printk("hppfs_read : read failed, errno = %d\n",
- count);
+ printk("hppfs_read : read failed, err = %d\n", -err);
n = err;
goto out_free;
}
@@ -237,8 +236,8 @@ static ssize_t hppfs_read(struct file *file, char *buf, size_t count,
}
else if(hppfs->host_fd != -1){
err = os_seek_file(hppfs->host_fd, *ppos);
- if(err){
- printk("hppfs_read : seek failed, errno = %d\n", err);
+ if(err < 0){
+ printk("hppfs_read : seek failed, err = %d\n", -err);
return(err);
}
count = hppfs_read_file(hppfs->host_fd, buf, count);
@@ -276,7 +275,7 @@ static int open_host_sock(char *host_file, int *filter_out)
strcpy(end, "/rw");
*filter_out = 1;
fd = os_connect_socket(host_file);
- if(fd > 0)
+ if(fd >= 0)
return(fd);
strcpy(end, "/r");
@@ -321,10 +320,14 @@ static struct hppfs_data *hppfs_get_data(int fd, int filter,
if(filter){
while((n = read_proc(proc_file, data->contents,
- sizeof(data->contents), NULL, 0)) > 0)
- os_write_file(fd, data->contents, n);
+ sizeof(data->contents), NULL, 0)) > 0) {
+ err = os_write_file(fd, data->contents, n);
+ if(err != n)
+ printk("hppfs_get_data : failed to write out "
+ "%d bytes, err = %d\n", n, -err);
+ }
err = os_shutdown_socket(fd, 0, 1);
- if(err){
+ if(err < 0){
printk("hppfs_get_data : failed to shut down "
"socket\n");
goto failed_free;
@@ -334,8 +337,8 @@ static struct hppfs_data *hppfs_get_data(int fd, int filter,
n = os_read_file(fd, data->contents, sizeof(data->contents));
if(n < 0){
err = n;
- printk("hppfs_get_data : read failed, errno = %d\n",
- err);
+ printk("hppfs_get_data : read failed, err = %d\n",
+ -err);
goto failed_free;
}
else if(n == 0)
@@ -405,14 +408,14 @@ static int hppfs_open(struct inode *inode, struct file *file)
fd = os_open_file(host_file, of_read(OPENFLAGS()), 0);
if(fd >= 0)
data->host_fd = fd;
- else printk("hppfs_open : failed to open '%s', errno = %d\n",
+ else printk("hppfs_open : failed to open '%s', err = %d\n",
host_file, -fd);
data->contents = NULL;
}
else if(type == OS_TYPE_DIR){
fd = open_host_sock(host_file, &filter);
- if(fd > 0){
+ if(fd >= 0){
data->contents = hppfs_get_data(fd, filter,
&data->proc_file,
file, &data->len);
@@ -420,7 +423,7 @@ static int hppfs_open(struct inode *inode, struct file *file)
data->host_fd = fd;
}
else printk("hppfs_open : failed to open a socket in "
- "'%s', errno = %d\n", host_file, -fd);
+ "'%s', err = %d\n", host_file, -fd);
}
kfree(host_file);
diff --git a/arch/um/include/os.h b/arch/um/include/os.h
index e6d99c5..f7ebe0c 100644
--- a/arch/um/include/os.h
+++ b/arch/um/include/os.h
@@ -17,6 +17,32 @@
#define OS_TYPE_FIFO 6
#define OS_TYPE_SOCK 7
+/* os_access() flags */
+#define OS_ACC_F_OK 0 /* Test for existence. */
+#define OS_ACC_X_OK 1 /* Test for execute permission. */
+#define OS_ACC_W_OK 2 /* Test for write permission. */
+#define OS_ACC_R_OK 4 /* Test for read permission. */
+#define OS_ACC_RW_OK (OS_ACC_W_OK | OS_ACC_R_OK) /* Test for RW permission */
+
+/*
+ * types taken from stat_file() in hostfs_user.c
+ * (if they are wrong here, they are wrong there...).
+ */
+struct uml_stat {
+ int st_dev; /* device */
+ unsigned long long st_ino; /* inode */
+ int st_mode; /* protection */
+ int st_nlink; /* number of hard links */
+ int st_uid; /* user ID of owner */
+ int st_gid; /* group ID of owner */
+ unsigned long long st_size; /* total size, in bytes */
+ int st_blksize; /* blocksize for filesystem I/O */
+ unsigned long long st_blocks; /* number of blocks allocated */
+ unsigned long st_atime; /* time of last access */
+ unsigned long st_mtime; /* time of last modification */
+ unsigned long st_ctime; /* time of last change */
+};
+
struct openflags {
unsigned int r : 1;
unsigned int w : 1;
@@ -91,15 +117,31 @@ static inline struct openflags of_cloexec(struct openflags flags)
return(flags);
}
+extern int os_stat_file(const char *file_name, struct uml_stat *buf);
+extern int os_stat_fd(const int fd, struct uml_stat *buf);
+extern int os_access(const char *file, int mode);
+extern void os_print_error(int error, const char* str);
+extern int os_get_exec_close(int fd, int *close_on_exec);
+extern int os_set_exec_close(int fd, int close_on_exec);
+extern int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg);
+extern int os_window_size(int fd, int *rows, int *cols);
+extern int os_new_tty_pgrp(int fd, int pid);
+extern int os_get_ifname(int fd, char *namebuf);
+extern int os_set_slip(int fd);
+extern int os_set_owner(int fd, int pid);
+extern int os_sigio_async(int master, int slave);
+extern int os_mode_fd(int fd, int mode);
+
extern int os_seek_file(int fd, __u64 offset);
extern int os_open_file(char *file, struct openflags flags, int mode);
extern int os_read_file(int fd, void *buf, int len);
-extern int os_write_file(int fd, void *buf, int count);
+extern int os_write_file(int fd, const void *buf, int count);
extern int os_file_size(char *file, long long *size_out);
extern int os_pipe(int *fd, int stream, int close_on_exec);
extern int os_set_fd_async(int fd, int owner);
extern int os_set_fd_block(int fd, int blocking);
extern int os_accept_connection(int fd);
+extern int os_create_unix_socket(char *file, int len, int close_on_exec);
extern int os_shutdown_socket(int fd, int r, int w);
extern void os_close_file(int fd);
extern int os_rcv_fd(int fd, int *helper_pid_out);
diff --git a/arch/um/kernel/helper.c b/arch/um/kernel/helper.c
index 5c4b279..0d6dd79 100644
--- a/arch/um/kernel/helper.c
+++ b/arch/um/kernel/helper.c
@@ -7,7 +7,6 @@
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
-#include <fcntl.h>
#include <sched.h>
#include <sys/signal.h>
#include <sys/wait.h>
@@ -33,6 +32,7 @@ static int helper_child(void *arg)
{
struct helper_data *data = arg;
char **argv = data->argv;
+ int errval;
if(helper_pause){
signal(SIGHUP, helper_hup);
@@ -41,8 +41,9 @@ static int helper_child(void *arg)
if(data->pre_exec != NULL)
(*data->pre_exec)(data->pre_data);
execvp(argv[0], argv);
+ errval = errno;
printk("execvp of '%s' failed - errno = %d\n", argv[0], errno);
- write(data->fd, &errno, sizeof(errno));
+ os_write_file(data->fd, &errval, sizeof(errval));
os_kill_process(os_getpid(), 0);
return(0);
}
@@ -59,17 +60,20 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
if((stack_out != NULL) && (*stack_out != 0))
stack = *stack_out;
else stack = alloc_stack(0, um_in_interrupt());
- if(stack == 0) return(-ENOMEM);
+ if(stack == 0)
+ return(-ENOMEM);
err = os_pipe(fds, 1, 0);
- if(err){
- printk("run_helper : pipe failed, errno = %d\n", -err);
- return(err);
+ if(err < 0){
+ printk("run_helper : pipe failed, err = %d\n", -err);
+ goto out_free;
}
- if(fcntl(fds[1], F_SETFD, 1) != 0){
- printk("run_helper : setting FD_CLOEXEC failed, errno = %d\n",
- errno);
- return(-errno);
+
+ err = os_set_exec_close(fds[1], 1);
+ if(err < 0){
+ printk("run_helper : setting FD_CLOEXEC failed, err = %d\n",
+ -err);
+ goto out_close;
}
sp = stack + page_size() - sizeof(void *);
@@ -80,23 +84,34 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data);
if(pid < 0){
printk("run_helper : clone failed, errno = %d\n", errno);
- return(-errno);
+ err = -errno;
+ goto out_close;
}
- close(fds[1]);
- n = read(fds[0], &err, sizeof(err));
+
+ os_close_file(fds[1]);
+ n = os_read_file(fds[0], &err, sizeof(err));
if(n < 0){
- printk("run_helper : read on pipe failed, errno = %d\n",
- errno);
- return(-errno);
+ printk("run_helper : read on pipe failed, err = %d\n", -n);
+ err = n;
+ goto out_kill;
}
else if(n != 0){
waitpid(pid, NULL, 0);
- pid = -err;
+ pid = -errno;
}
if(stack_out == NULL) free_stack(stack, 0);
else *stack_out = stack;
return(pid);
+
+ out_kill:
+ os_kill_process(pid, 1);
+ out_close:
+ os_close_file(fds[0]);
+ os_close_file(fds[1]);
+ out_free:
+ free_stack(stack, 0);
+ return(err);
}
int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
@@ -119,7 +134,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
pid = waitpid(pid, &status, 0);
if(pid < 0)
printk("run_helper_thread - wait failed, errno = %d\n",
- pid);
+ -pid);
if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
printk("run_helper_thread - thread returned status "
"0x%x\n", status);
diff --git a/arch/um/kernel/initrd_user.c b/arch/um/kernel/initrd_user.c
index 944c734..265cbab 100644
--- a/arch/um/kernel/initrd_user.c
+++ b/arch/um/kernel/initrd_user.c
@@ -6,7 +6,6 @@
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
-#include <fcntl.h>
#include <errno.h>
#include "user_util.h"
@@ -19,13 +18,15 @@ int load_initrd(char *filename, void *buf, int size)
{
int fd, n;
- if((fd = os_open_file(filename, of_read(OPENFLAGS()), 0)) < 0){
- printk("Opening '%s' failed - errno = %d\n", filename, errno);
+ fd = os_open_file(filename, of_read(OPENFLAGS()), 0);
+ if(fd < 0){
+ printk("Opening '%s' failed - err = %d\n", filename, -fd);
return(-1);
}
- if((n = read(fd, buf, size)) != size){
- printk("Read of %d bytes from '%s' returned %d, errno = %d\n",
- size, filename, n, errno);
+ n = os_read_file(fd, buf, size);
+ if(n != size){
+ printk("Read of %d bytes from '%s' failed, err = %d\n", size,
+ filename, -n);
return(-1);
}
return(0);
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c
index d04b639..c895d9a 100644
--- a/arch/um/kernel/irq.c
+++ b/arch/um/kernel/irq.c
@@ -465,7 +465,8 @@ int setup_irq(unsigned int irq, struct irqaction * new)
*/
spin_lock_irqsave(&desc->lock,flags);
p = &desc->action;
- if ((old = *p) != NULL) {
+ old = *p;
+ if (old != NULL) {
/* Can't share interrupts unless both agree to */
if (!(old->flags & new->flags & SA_SHIRQ)) {
spin_unlock_irqrestore(&desc->lock,flags);
diff --git a/arch/um/kernel/irq_user.c b/arch/um/kernel/irq_user.c
index 57fe9bb..87ac2b0 100644
--- a/arch/um/kernel/irq_user.c
+++ b/arch/um/kernel/irq_user.c
@@ -6,7 +6,6 @@
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
-#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <sys/poll.h>
@@ -49,7 +48,8 @@ void sigio_handler(int sig, union uml_pt_regs *regs)
if(smp_sigio_handler()) return;
while(1){
- if((n = poll(pollfds, pollfds_num, 0)) < 0){
+ n = poll(pollfds, pollfds_num, 0);
+ if(n < 0){
if(errno == EINTR) continue;
printk("sigio_handler : poll returned %d, "
"errno = %d\n", n, errno);
@@ -366,34 +366,31 @@ void deactivate_fd(int fd, int irqnum)
void forward_ipi(int fd, int pid)
{
- if(fcntl(fd, F_SETOWN, pid) < 0){
- int save_errno = errno;
- if(fcntl(fd, F_GETOWN, 0) != pid){
- printk("forward_ipi: F_SETOWN failed, fd = %d, "
- "me = %d, target = %d, errno = %d\n", fd,
- os_getpid(), pid, save_errno);
- }
- }
+ int err;
+
+ err = os_set_owner(fd, pid);
+ if(err < 0)
+ printk("forward_ipi: set_owner failed, fd = %d, me = %d, "
+ "target = %d, err = %d\n", fd, os_getpid(), pid, -err);
}
void forward_interrupts(int pid)
{
struct irq_fd *irq;
unsigned long flags;
+ int err;
flags = irq_lock();
for(irq=active_fds;irq != NULL;irq = irq->next){
- if(fcntl(irq->fd, F_SETOWN, pid) < 0){
- int save_errno = errno;
- if(fcntl(irq->fd, F_GETOWN, 0) != pid){
- /* XXX Just remove the irq rather than
- * print out an infinite stream of these
- */
- printk("Failed to forward %d to pid %d, "
- "errno = %d\n", irq->fd, pid,
- save_errno);
- }
+ err = os_set_owner(irq->fd, pid);
+ if(err < 0){
+ /* XXX Just remove the irq rather than
+ * print out an infinite stream of these
+ */
+ printk("Failed to forward %d to pid %d, err = %d\n",
+ irq->fd, pid, -err);
}
+
irq->pid = pid;
}
irq_unlock(flags);
diff --git a/arch/um/kernel/ksyms.c b/arch/um/kernel/ksyms.c
index 5f681aa..d7c76e4 100644
--- a/arch/um/kernel/ksyms.c
+++ b/arch/um/kernel/ksyms.c
@@ -42,17 +42,32 @@ EXPORT_SYMBOL(to_virt);
EXPORT_SYMBOL(mode_tt);
EXPORT_SYMBOL(handle_page_fault);
+EXPORT_SYMBOL(os_stat_fd);
+EXPORT_SYMBOL(os_stat_file);
+EXPORT_SYMBOL(os_access);
+EXPORT_SYMBOL(os_print_error);
+EXPORT_SYMBOL(os_get_exec_close);
+EXPORT_SYMBOL(os_set_exec_close);
EXPORT_SYMBOL(os_getpid);
EXPORT_SYMBOL(os_open_file);
EXPORT_SYMBOL(os_read_file);
EXPORT_SYMBOL(os_write_file);
EXPORT_SYMBOL(os_seek_file);
+EXPORT_SYMBOL(os_lock_file);
EXPORT_SYMBOL(os_pipe);
EXPORT_SYMBOL(os_file_type);
+EXPORT_SYMBOL(os_file_mode);
+EXPORT_SYMBOL(os_file_size);
+EXPORT_SYMBOL(os_flush_stdout);
EXPORT_SYMBOL(os_close_file);
+EXPORT_SYMBOL(os_set_fd_async);
+EXPORT_SYMBOL(os_set_fd_block);
EXPORT_SYMBOL(helper_wait);
EXPORT_SYMBOL(os_shutdown_socket);
+EXPORT_SYMBOL(os_create_unix_socket);
EXPORT_SYMBOL(os_connect_socket);
+EXPORT_SYMBOL(os_accept_connection);
+EXPORT_SYMBOL(os_rcv_fd);
EXPORT_SYMBOL(run_helper);
EXPORT_SYMBOL(start_thread);
EXPORT_SYMBOL(dump_thread);
diff --git a/arch/um/kernel/mem_user.c b/arch/um/kernel/mem_user.c
index 116c338..ff4ee46 100644
--- a/arch/um/kernel/mem_user.c
+++ b/arch/um/kernel/mem_user.c
@@ -34,10 +34,8 @@
#include <stddef.h>
#include <stdarg.h>
#include <unistd.h>
-#include <fcntl.h>
#include <errno.h>
#include <string.h>
-#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#include "kern_util.h"
@@ -55,25 +53,33 @@ extern struct mem_region physmem_region;
int create_mem_file(unsigned long len)
{
- int fd;
+ int fd, err;
char zero;
fd = make_tempfile(TEMPNAME_TEMPLATE, NULL, 1);
- if (fchmod(fd, 0777) < 0){
- perror("fchmod");
+ if(fd < 0) {
+ os_print_error(fd, "make_tempfile");
exit(1);
}
- if(os_seek_file(fd, len) < 0){
- perror("lseek");
+ err = os_mode_fd(fd, 0777);
+ if(err < 0){
+ os_print_error(err, "change_mode");
+ exit(1);
+ }
+ err = os_seek_file(fd, len);
+ if(err < 0){
+ os_print_error(err, "seek_file");
exit(1);
}
zero = 0;
- if(write(fd, &zero, 1) != 1){
- perror("write");
+ err = os_write_file(fd, &zero, 1);
+ if(err != 1){
+ os_print_error(err, "write_file");
exit(1);
}
- if(fcntl(fd, F_SETFD, 1) != 0)
- perror("Setting FD_CLOEXEC failed");
+ err = os_set_exec_close(fd, 1);
+ if(err < 0)
+ os_print_error(err, "exec_close");
return(fd);
}
@@ -83,9 +89,9 @@ int iomem_size = 0;
static int __init parse_iomem(char *str, int *add)
{
struct iomem_region *new;
- struct stat64 buf;
+ struct uml_stat buf;
char *file, *driver;
- int fd;
+ int fd, err;
driver = str;
file = strchr(str,',');
@@ -97,11 +103,12 @@ static int __init parse_iomem(char *str, int *add)
file++;
fd = os_open_file(file, of_rdwr(OPENFLAGS()), 0);
if(fd < 0){
- perror("parse_iomem - Couldn't open io file");
+ os_print_error(fd, "parse_iomem - Couldn't open io file");
goto out;
}
- if(fstat64(fd, &buf) < 0){
- perror("parse_iomem - cannot fstat file");
+ err = os_stat_fd(fd, &buf);
+ if(err < 0){
+ os_print_error(err, "parse_iomem - cannot stat_fd file");
goto out_close;
}
@@ -122,7 +129,7 @@ static int __init parse_iomem(char *str, int *add)
return(0);
out_close:
- close(fd);
+ os_close_file(fd);
out:
return(1);
}
@@ -135,10 +142,13 @@ __uml_setup("iomem=", parse_iomem,
int protect_memory(unsigned long addr, unsigned long len, int r, int w, int x,
int must_succeed)
{
- if(os_protect_memory((void *) addr, len, r, w, x) < 0){
+ int err;
+
+ err = os_protect_memory((void *) addr, len, r, w, x);
+ if(err < 0){
if(must_succeed)
- panic("protect failed, errno = %d", errno);
- else return(-errno);
+ panic("protect failed, err = %d", -err);
+ else return(err);
}
return(0);
}
diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c
index 07d3a14..0ccab50 100644
--- a/arch/um/kernel/physmem.c
+++ b/arch/um/kernel/physmem.c
@@ -98,7 +98,7 @@ int physmem_remove_mapping(void *virt)
err = os_map_memory(virt, physmem_fd, __pa(virt), PAGE_SIZE, 1, 1, 0);
if(err)
panic("Failed to unmap block device page from physical memory, "
- "errno = %d", err);
+ "errno = %d", -err);
return(1);
}
@@ -220,8 +220,8 @@ void setup_physmem(unsigned long start, unsigned long reserve_end,
offset = uml_reserved - uml_physmem;
err = os_map_memory((void *) uml_reserved, physmem_fd, offset,
len - offset, 1, 1, 0);
- if(err){
- perror("Mapping memory");
+ if(err < 0){
+ os_print_error(err, "Mapping memory");
exit(1);
}
@@ -301,7 +301,7 @@ int setup_iomem(void)
region->size, 1, 1, 0);
if(err)
printk("Mapping iomem region for driver '%s' failed, "
- "errno = %d\n", region->driver, err);
+ "errno = %d\n", region->driver, -err);
else {
region->virt = iomem_start;
region->phys = __pa(region->virt);
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
index bc693ec..00435c2 100644
--- a/arch/um/kernel/process.c
+++ b/arch/um/kernel/process.c
@@ -9,12 +9,10 @@
#include <sched.h>
#include <errno.h>
#include <stdarg.h>
-#include <fcntl.h>
#include <stdlib.h>
#include <setjmp.h>
#include <sys/time.h>
#include <sys/ptrace.h>
-#include <sys/ioctl.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <asm/ptrace.h>
@@ -122,7 +120,7 @@ int start_fork_tramp(void *thread_arg, unsigned long temp_stack,
/* Start the process and wait for it to kill itself */
new_pid = clone(outer_tramp, (void *) sp, clone_flags, &arg);
if(new_pid < 0) return(-errno);
- while((err = waitpid(new_pid, &status, 0) < 0) && (errno == EINTR)) ;
+ while(((err = waitpid(new_pid, &status, 0)) < 0) && (errno == EINTR)) ;
if(err < 0) panic("Waiting for outer trampoline failed - errno = %d",
errno);
if(!WIFSIGNALED(status) || (WTERMSIG(status) != SIGKILL))
@@ -137,7 +135,7 @@ void suspend_new_thread(int fd)
os_stop_process(os_getpid());
- if(read(fd, &c, sizeof(c)) != sizeof(c))
+ if(os_read_file(fd, &c, sizeof(c)) != sizeof(c))
panic("read failed in suspend_new_thread");
}
@@ -262,7 +260,7 @@ int can_do_skas(void)
stop_ptraced_child(pid, stack, 1);
printf("Checking for /proc/mm...");
- if(access("/proc/mm", W_OK)){
+ if(os_access("/proc/mm", OS_ACC_W_OK) < 0){
printf("not found\n");
ret = 0;
}
diff --git a/arch/um/kernel/process_kern.c b/arch/um/kernel/process_kern.c
index b20ac5c..2ad14d0 100644
--- a/arch/um/kernel/process_kern.c
+++ b/arch/um/kernel/process_kern.c
@@ -90,7 +90,8 @@ unsigned long alloc_stack(int order, int atomic)
int flags = GFP_KERNEL;
if(atomic) flags |= GFP_ATOMIC;
- if((page = __get_free_pages(flags, order)) == 0)
+ page = __get_free_pages(flags, order);
+ if(page == 0)
return(0);
stack_protections(page);
return(page);
diff --git a/arch/um/kernel/sigio_user.c b/arch/um/kernel/sigio_user.c
index b5ce13d..250fdfb 100644
--- a/arch/um/kernel/sigio_user.c
+++ b/arch/um/kernel/sigio_user.c
@@ -7,7 +7,6 @@
#include <stdlib.h>
#include <termios.h>
#include <pty.h>
-#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
@@ -45,7 +44,7 @@ static void openpty_cb(void *arg)
info->err = 0;
if(openpty(&info->master, &info->slave, NULL, NULL, NULL))
- info->err = errno;
+ info->err = -errno;
}
void __init check_one_sigio(void (*proc)(int, int))
@@ -53,11 +52,11 @@ void __init check_one_sigio(void (*proc)(int, int))
struct sigaction old, new;
struct termios tt;
struct openpty_arg pty = { .master = -1, .slave = -1 };
- int master, slave, flags;
+ int master, slave, err;
initial_thread_cb(openpty_cb, &pty);
if(pty.err){
- printk("openpty failed, errno = %d\n", pty.err);
+ printk("openpty failed, errno = %d\n", -pty.err);
return;
}
@@ -75,17 +74,9 @@ void __init check_one_sigio(void (*proc)(int, int))
if(tcsetattr(master, TCSADRAIN, &tt) < 0)
panic("check_sigio : tcsetattr failed, errno = %d\n", errno);
- if((flags = fcntl(master, F_GETFL)) < 0)
- panic("tty_fds : fcntl F_GETFL failed, errno = %d\n", errno);
-
- if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) ||
- (fcntl(master, F_SETOWN, os_getpid()) < 0))
- panic("check_sigio : fcntl F_SETFL or F_SETOWN failed, "
- "errno = %d\n", errno);
-
- if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0))
- panic("check_sigio : fcntl F_SETFL failed, errno = %d\n",
- errno);
+ err = os_sigio_async(master, slave);
+ if(err < 0)
+ panic("tty_fds : sigio_async failed, err = %d\n", -err);
if(sigaction(SIGIO, NULL, &old) < 0)
panic("check_sigio : sigaction 1 failed, errno = %d\n", errno);
@@ -97,8 +88,8 @@ void __init check_one_sigio(void (*proc)(int, int))
got_sigio = 0;
(*proc)(master, slave);
- close(master);
- close(slave);
+ os_close_file(master);
+ os_close_file(slave);
if(sigaction(SIGIO, &old, NULL) < 0)
panic("check_sigio : sigaction 3 failed, errno = %d\n", errno);
@@ -112,25 +103,25 @@ static void tty_output(int master, int slave)
printk("Checking that host ptys support output SIGIO...");
memset(buf, 0, sizeof(buf));
+
while(write(master, buf, sizeof(buf)) > 0) ;
if(errno != EAGAIN)
panic("check_sigio : write failed, errno = %d\n", errno);
-
while(((n = read(slave, buf, sizeof(buf))) > 0) && !got_sigio) ;
if(got_sigio){
printk("Yes\n");
pty_output_sigio = 1;
}
- else if(errno == EAGAIN) printk("No, enabling workaround\n");
- else panic("check_sigio : read failed, errno = %d\n", errno);
+ else if(n == -EAGAIN) printk("No, enabling workaround\n");
+ else panic("check_sigio : read failed, err = %d\n", n);
}
static void tty_close(int master, int slave)
{
printk("Checking that host ptys support SIGIO on close...");
- close(slave);
+ os_close_file(slave);
if(got_sigio){
printk("Yes\n");
pty_close_sigio = 1;
@@ -140,7 +131,8 @@ static void tty_close(int master, int slave)
void __init check_sigio(void)
{
- if(access("/dev/ptmx", R_OK) && access("/dev/ptyp0", R_OK)){
+ if((os_access("/dev/ptmx", OS_ACC_R_OK) < 0) &&
+ (os_access("/dev/ptyp0", OS_ACC_R_OK) < 0)){
printk("No pseudo-terminals available - skipping pty SIGIO "
"check\n");
return;
@@ -201,11 +193,10 @@ static int write_sigio_thread(void *unused)
p = &fds->poll[i];
if(p->revents == 0) continue;
if(p->fd == sigio_private[1]){
- n = read(sigio_private[1], &c, sizeof(c));
+ n = os_read_file(sigio_private[1], &c, sizeof(c));
if(n != sizeof(c))
printk("write_sigio_thread : "
- "read failed, errno = %d\n",
- errno);
+ "read failed, err = %d\n", -n);
tmp = current_poll;
current_poll = next_poll;
next_poll = tmp;
@@ -218,10 +209,10 @@ static int write_sigio_thread(void *unused)
(fds->used - i) * sizeof(*fds->poll));
}
- n = write(respond_fd, &c, sizeof(c));
+ n = os_write_file(respond_fd, &c, sizeof(c));
if(n != sizeof(c))
printk("write_sigio_thread : write failed, "
- "errno = %d\n", errno);
+ "err = %d\n", -n);
}
}
}
@@ -252,15 +243,15 @@ static void update_thread(void)
char c;
flags = set_signals(0);
- n = write(sigio_private[0], &c, sizeof(c));
+ n = os_write_file(sigio_private[0], &c, sizeof(c));
if(n != sizeof(c)){
- printk("update_thread : write failed, errno = %d\n", errno);
+ printk("update_thread : write failed, err = %d\n", -n);
goto fail;
}
- n = read(sigio_private[0], &c, sizeof(c));
+ n = os_read_file(sigio_private[0], &c, sizeof(c));
if(n != sizeof(c)){
- printk("update_thread : read failed, errno = %d\n", errno);
+ printk("update_thread : read failed, err = %d\n", -n);
goto fail;
}
@@ -271,10 +262,10 @@ static void update_thread(void)
if(write_sigio_pid != -1)
os_kill_process(write_sigio_pid, 1);
write_sigio_pid = -1;
- close(sigio_private[0]);
- close(sigio_private[1]);
- close(write_sigio_fds[0]);
- close(write_sigio_fds[1]);
+ os_close_file(sigio_private[0]);
+ os_close_file(sigio_private[1]);
+ os_close_file(write_sigio_fds[0]);
+ os_close_file(write_sigio_fds[1]);
sigio_unlock();
set_signals(flags);
}
@@ -369,15 +360,15 @@ void write_sigio_workaround(void)
goto out;
err = os_pipe(write_sigio_fds, 1, 1);
- if(err){
+ if(err < 0){
printk("write_sigio_workaround - os_pipe 1 failed, "
- "errno = %d\n", -err);
+ "err = %d\n", -err);
goto out;
}
err = os_pipe(sigio_private, 1, 1);
- if(err){
+ if(err < 0){
printk("write_sigio_workaround - os_pipe 2 failed, "
- "errno = %d\n", -err);
+ "err = %d\n", -err);
goto out_close1;
}
if(setup_initial_poll(sigio_private[1]))
@@ -399,11 +390,11 @@ void write_sigio_workaround(void)
os_kill_process(write_sigio_pid, 1);
write_sigio_pid = -1;
out_close2:
- close(sigio_private[0]);
- close(sigio_private[1]);
+ os_close_file(sigio_private[0]);
+ os_close_file(sigio_private[1]);
out_close1:
- close(write_sigio_fds[0]);
- close(write_sigio_fds[1]);
+ os_close_file(write_sigio_fds[0]);
+ os_close_file(write_sigio_fds[1]);
sigio_unlock();
}
@@ -412,10 +403,16 @@ int read_sigio_fd(int fd)
int n;
char c;
- n = read(fd, &c, sizeof(c));
+ n = os_read_file(fd, &c, sizeof(c));
if(n != sizeof(c)){
- printk("read_sigio_fd - read failed, errno = %d\n", errno);
- return(-errno);
+ if(n < 0) {
+ printk("read_sigio_fd - read failed, err = %d\n", -n);
+ return(n);
+ }
+ else {
+ printk("read_sigio_fd - short read, bytes = %d\n", n);
+ return(-EIO);
+ }
}
return(n);
}
diff --git a/arch/um/kernel/signal_kern.c b/arch/um/kernel/signal_kern.c
index aac18d2..deff1aa 100644
--- a/arch/um/kernel/signal_kern.c
+++ b/arch/um/kernel/signal_kern.c
@@ -154,7 +154,8 @@ static int kern_do_signal(struct pt_regs *regs, sigset_t *oldset, int error)
schedule();
/* We're back. Did the debugger cancel the sig? */
- if (!(signr = current->exit_code))
+ signr = current->exit_code;
+ if (!signr)
continue;
current->exit_code = 0;
diff --git a/arch/um/kernel/skas/mem_user.c b/arch/um/kernel/skas/mem_user.c
index f6f2957..1909125 100644
--- a/arch/um/kernel/skas/mem_user.c
+++ b/arch/um/kernel/skas/mem_user.c
@@ -36,7 +36,7 @@ void map(int fd, unsigned long virt, unsigned long phys, unsigned long len,
} } } );
n = os_write_file(fd, &map, sizeof(map));
if(n != sizeof(map))
- printk("map : /proc/mm map failed, errno = %d\n", errno);
+ printk("map : /proc/mm map failed, err = %d\n", -n);
}
int unmap(int fd, void *addr, int len)
@@ -50,8 +50,13 @@ int unmap(int fd, void *addr, int len)
{ .addr = (unsigned long) addr,
.len = len } } } );
n = os_write_file(fd, &unmap, sizeof(unmap));
- if((n != 0) && (n != sizeof(unmap)))
- return(-errno);
+ if(n != sizeof(unmap)) {
+ if(n < 0)
+ return(n);
+ else if(n > 0)
+ return(-EIO);
+ }
+
return(0);
}
@@ -72,11 +77,15 @@ int protect(int fd, unsigned long addr, unsigned long len, int r, int w,
.prot = prot } } } );
n = os_write_file(fd, &protect, sizeof(protect));
- if((n != 0) && (n != sizeof(protect))){
+ if(n != sizeof(protect)) {
+ if(n == 0) return(0);
+
if(must_succeed)
- panic("protect failed, errno = %d", errno);
- return(-errno);
+ panic("protect failed, err = %d", -n);
+
+ return(-EIO);
}
+
return(0);
}
diff --git a/arch/um/kernel/skas/process.c b/arch/um/kernel/skas/process.c
index 210ff93..a364467 100644
--- a/arch/um/kernel/skas/process.c
+++ b/arch/um/kernel/skas/process.c
@@ -232,7 +232,7 @@ void save_registers(union uml_pt_regs *regs)
err = move_registers(PTRACE_GETREGS, fp_op, regs, fp_regs);
if(err)
panic("save_registers - saving registers failed, errno = %d\n",
- err);
+ -err);
}
void restore_registers(union uml_pt_regs *regs)
@@ -252,7 +252,7 @@ void restore_registers(union uml_pt_regs *regs)
err = move_registers(PTRACE_SETREGS, fp_op, regs, fp_regs);
if(err)
panic("restore_registers - saving registers failed, "
- "errno = %d\n", err);
+ "errno = %d\n", -err);
}
void switch_threads(void *me, void *next)
@@ -344,7 +344,7 @@ int new_mm(int from)
of_cloexec(of_write(OPENFLAGS())), 0);
if(fd < 0)
- return(-errno);
+ return(fd);
if(from != -1){
copy = ((struct proc_mm_op) { .op = MM_COPY_SEGMENTS,
@@ -353,7 +353,7 @@ int new_mm(int from)
n = os_write_file(fd, &copy, sizeof(copy));
if(n != sizeof(copy))
printk("new_mm : /proc/mm copy_segments failed, "
- "errno = %d\n", errno);
+ "err = %d\n", -n);
}
return(fd);
diff --git a/arch/um/kernel/smp.c b/arch/um/kernel/smp.c
index 869ea6e..6a95394 100644
--- a/arch/um/kernel/smp.c
+++ b/arch/um/kernel/smp.c
@@ -52,7 +52,7 @@ static int num_reschedules_sent = 0;
void smp_send_reschedule(int cpu)
{
- write(cpu_data[cpu].ipi_pipe[1], "R", 1);
+ os_write_file(cpu_data[cpu].ipi_pipe[1], "R", 1);
num_reschedules_sent++;
}
@@ -99,7 +99,7 @@ void smp_send_stop(void)
for(i = 0; i < ncpus; i++){
if(i == current->processor)
continue;
- write(cpu_data[i].ipi_pipe[1], "S", 1);
+ os_write_file(cpu_data[i].ipi_pipe[1], "S", 1);
}
printk("done\n");
}
@@ -127,9 +127,8 @@ static int idle_proc(void *unused)
cpu = current->processor;
err = os_pipe(cpu_data[cpu].ipi_pipe, 1, 1);
- if(err)
- panic("CPU#%d failed to create IPI pipe, errno = %d", cpu,
- -err);
+ if(err < 0)
+ panic("CPU#%d failed to create IPI pipe, err = %d", cpu, -err);
activate_ipi(cpu_data[cpu].ipi_pipe[0],
current->thread.mode.tt.extern_pid);
@@ -170,7 +169,7 @@ static int idle_thread(int (*fn)(void *), int cpu)
new_task->processor = cpu;
new_task->cpus_allowed = 1 << cpu;
new_task->cpus_runnable = new_task->cpus_allowed;
- CHOOSE_MODE(write(new_task->thread.mode.tt.switch_pipe[1], &c,
+ CHOOSE_MODE(os_write_file(new_task->thread.mode.tt.switch_pipe[1], &c,
sizeof(c)),
({ panic("skas mode doesn't support SMP"); }));
return(new_task->thread.mode.tt.extern_pid);
@@ -188,7 +187,8 @@ void smp_boot_cpus(void)
set_bit(0, &smp_callin_map);
err = os_pipe(cpu_data[0].ipi_pipe, 1, 1);
- if(err) panic("CPU#0 failed to create IPI pipe, errno = %d", -err);
+ if(err < 0)
+ panic("CPU#0 failed to create IPI pipe, err = %d", -err);
activate_ipi(cpu_data[0].ipi_pipe[0],
current->thread.mode.tt.extern_pid);
@@ -249,7 +249,7 @@ void IPI_handler(int cpu)
int fd;
fd = cpu_data[cpu].ipi_pipe[0];
- while (read(fd, &c, 1) == 1) {
+ while (os_read_file(fd, &c, 1) == 1) {
switch (c) {
case 'C':
smp_call_function_slave(cpu);
@@ -307,7 +307,7 @@ int smp_call_function(void (*_func)(void *info), void *_info, int nonatomic,
for (i=0;i<NR_CPUS;i++)
if (i != current->processor && test_bit(i, &cpu_online_map))
- write(cpu_data[i].ipi_pipe[1], "C", 1);
+ os_write_file(cpu_data[i].ipi_pipe[1], "C", 1);
while (atomic_read(&scf_started) != cpus)
barrier();
diff --git a/arch/um/kernel/tempfile.c b/arch/um/kernel/tempfile.c
index 7fde8f5..2302427 100644
--- a/arch/um/kernel/tempfile.c
+++ b/arch/um/kernel/tempfile.c
@@ -50,7 +50,8 @@ int make_tempfile(const char *template, char **out_tempname, int do_unlink)
else
*tempname = 0;
strcat(tempname, template);
- if((fd = mkstemp(tempname)) < 0){
+ fd = mkstemp(tempname);
+ if(fd < 0){
fprintf(stderr, "open - cannot create %s: %s\n", tempname,
strerror(errno));
return -1;
@@ -60,7 +61,8 @@ int make_tempfile(const char *template, char **out_tempname, int do_unlink)
return -1;
}
if(out_tempname){
- if((*out_tempname = strdup(tempname)) == NULL){
+ *out_tempname = strdup(tempname);
+ if(*out_tempname == NULL){
perror("strdup");
return -1;
}
diff --git a/arch/um/kernel/time_kern.c b/arch/um/kernel/time_kern.c
index 1743887..b45f75f 100644
--- a/arch/um/kernel/time_kern.c
+++ b/arch/um/kernel/time_kern.c
@@ -149,8 +149,8 @@ int __init timer_init(void)
int err;
CHOOSE_MODE(user_time_init_tt(), user_time_init_skas());
- if((err = request_irq(TIMER_IRQ, um_timer, SA_INTERRUPT, "timer",
- NULL)) != 0)
+ err = request_irq(TIMER_IRQ, um_timer, SA_INTERRUPT, "timer", NULL);
+ if(err != 0)
printk(KERN_ERR "timer_init : request_irq failed - "
"errno = %d\n", -err);
timer_irq_inited = 1;
diff --git a/arch/um/kernel/trap_user.c b/arch/um/kernel/trap_user.c
index f54f7f2..a2cfff2 100644
--- a/arch/um/kernel/trap_user.c
+++ b/arch/um/kernel/trap_user.c
@@ -5,11 +5,9 @@
#include <stdlib.h>
#include <errno.h>
-#include <fcntl.h>
#include <setjmp.h>
#include <signal.h>
#include <sys/time.h>
-#include <sys/ioctl.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <asm/page.h>
diff --git a/arch/um/kernel/tt/mem_user.c b/arch/um/kernel/tt/mem_user.c
index e10db3f..3085267 100644
--- a/arch/um/kernel/tt/mem_user.c
+++ b/arch/um/kernel/tt/mem_user.c
@@ -25,14 +25,13 @@ void remap_data(void *segment_start, void *segment_end, int w)
size = (unsigned long) segment_end -
(unsigned long) segment_start;
data = create_mem_file(size);
- if((addr = mmap(NULL, size, PROT_WRITE | PROT_READ,
- MAP_SHARED, data, 0)) == MAP_FAILED){
+ addr = mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_SHARED, data, 0);
+ if(addr == MAP_FAILED){
perror("mapping new data segment");
exit(1);
}
memcpy(addr, segment_start, size);
- if(switcheroo(data, prot, addr, segment_start,
- size) < 0){
+ if(switcheroo(data, prot, addr, segment_start, size) < 0){
printf("switcheroo failed\n");
exit(1);
}
diff --git a/arch/um/kernel/tt/process_kern.c b/arch/um/kernel/tt/process_kern.c
index 4cb1406..71ef2ac 100644
--- a/arch/um/kernel/tt/process_kern.c
+++ b/arch/um/kernel/tt/process_kern.c
@@ -57,7 +57,7 @@ void *_switch_to_tt(void *prev, void *next)
reading = 0;
err = os_write_file(to->thread.mode.tt.switch_pipe[1], &c, sizeof(c));
if(err != sizeof(c))
- panic("write of switch_pipe failed, errno = %d", -err);
+ panic("write of switch_pipe failed, err = %d", -err);
reading = 1;
if(from->state == TASK_ZOMBIE)
@@ -104,8 +104,8 @@ void release_thread_tt(struct task_struct *task)
void exit_thread_tt(void)
{
- close(current->thread.mode.tt.switch_pipe[0]);
- close(current->thread.mode.tt.switch_pipe[1]);
+ os_close_file(current->thread.mode.tt.switch_pipe[0]);
+ os_close_file(current->thread.mode.tt.switch_pipe[1]);
}
extern void schedule_tail(struct task_struct *prev);
@@ -204,8 +204,8 @@ int copy_thread_tt(int nr, unsigned long clone_flags, unsigned long sp,
}
err = os_pipe(p->thread.mode.tt.switch_pipe, 1, 1);
- if(err){
- printk("copy_thread : pipe failed, errno = %d\n", -err);
+ if(err < 0){
+ printk("copy_thread : pipe failed, err = %d\n", -err);
return(err);
}
@@ -449,8 +449,9 @@ void set_init_pid(int pid)
init_task.thread.mode.tt.extern_pid = pid;
err = os_pipe(init_task.thread.mode.tt.switch_pipe, 1, 1);
- if(err) panic("Can't create switch pipe for init_task, errno = %d",
- err);
+ if(err)
+ panic("Can't create switch pipe for init_task, errno = %d",
+ -err);
}
int singlestepping_tt(void *t)
diff --git a/arch/um/kernel/tt/ptproxy/proxy.c b/arch/um/kernel/tt/ptproxy/proxy.c
index fea1dea..de417c4 100644
--- a/arch/um/kernel/tt/ptproxy/proxy.c
+++ b/arch/um/kernel/tt/ptproxy/proxy.c
@@ -15,7 +15,6 @@ Jeff Dike (jdike@karaya.com) : Modified for integration into uml
#include <unistd.h>
#include <signal.h>
#include <string.h>
-#include <fcntl.h>
#include <termios.h>
#include <sys/wait.h>
#include <sys/types.h>
@@ -304,7 +303,8 @@ int start_debugger(char *prog, int startup, int stop, int *fd_out)
int slave, child;
slave = open_gdb_chan();
- if((child = fork()) == 0){
+ child = fork();
+ if(child == 0){
char *tempname = NULL;
int fd;
@@ -327,18 +327,19 @@ int start_debugger(char *prog, int startup, int stop, int *fd_out)
exit(1);
#endif
}
- if((fd = make_tempfile("/tmp/gdb_init-XXXXXX", &tempname, 0)) < 0){
- printk("start_debugger : make_tempfile failed, errno = %d\n",
- errno);
+ fd = make_tempfile("/tmp/gdb_init-XXXXXX", &tempname, 0);
+ if(fd < 0){
+ printk("start_debugger : make_tempfile failed,"
+ "err = %d\n", -fd);
exit(1);
}
- write(fd, gdb_init_string, sizeof(gdb_init_string) - 1);
+ os_write_file(fd, gdb_init_string, sizeof(gdb_init_string) - 1);
if(startup){
if(stop){
- write(fd, "b start_kernel\n",
+ os_write_file(fd, "b start_kernel\n",
strlen("b start_kernel\n"));
}
- write(fd, "c\n", strlen("c\n"));
+ os_write_file(fd, "c\n", strlen("c\n"));
}
if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){
printk("start_debugger : PTRACE_TRACEME failed, "
diff --git a/arch/um/kernel/tt/tracer.c b/arch/um/kernel/tt/tracer.c
index 51502e1..3271e6a 100644
--- a/arch/um/kernel/tt/tracer.c
+++ b/arch/um/kernel/tt/tracer.c
@@ -44,11 +44,12 @@ int is_tracer_winch(int pid, int fd, void *data)
static void tracer_winch_handler(int sig)
{
+ int n;
char c = 1;
- if(write(tracer_winch[1], &c, sizeof(c)) != sizeof(c))
- printk("tracer_winch_handler - write failed, errno = %d\n",
- errno);
+ n = os_write_file(tracer_winch[1], &c, sizeof(c));
+ if(n != sizeof(c))
+ printk("tracer_winch_handler - write failed, err = %d\n", -n);
}
/* Called only by the tracing thread during initialization */
@@ -58,9 +59,8 @@ static void setup_tracer_winch(void)
int err;
err = os_pipe(tracer_winch, 1, 1);
- if(err){
- printk("setup_tracer_winch : os_pipe failed, errno = %d\n",
- -err);
+ if(err < 0){
+ printk("setup_tracer_winch : os_pipe failed, err = %d\n", -err);
return;
}
signal(SIGWINCH, tracer_winch_handler);
@@ -130,8 +130,8 @@ static void sleeping_process_signal(int pid, int sig)
case SIGTSTP:
if(ptrace(PTRACE_CONT, pid, 0, sig) < 0)
tracer_panic("sleeping_process_signal : Failed to "
- "continue pid %d, errno = %d\n", pid,
- sig);
+ "continue pid %d, signal = %d, "
+ "errno = %d\n", pid, sig, errno);
break;
/* This happens when the debugger (e.g. strace) is doing system call
@@ -145,7 +145,7 @@ static void sleeping_process_signal(int pid, int sig)
if(ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)
tracer_panic("sleeping_process_signal : Failed to "
"PTRACE_SYSCALL pid %d, errno = %d\n",
- pid, sig);
+ pid, errno);
break;
case SIGSTOP:
break;
@@ -218,7 +218,7 @@ int tracer(int (*init_proc)(void *), void *sp)
err = attach(debugger_parent);
if(err){
printf("Failed to attach debugger parent %d, "
- "errno = %d\n", debugger_parent, err);
+ "errno = %d\n", debugger_parent, -err);
debugger_parent = -1;
}
else {
@@ -233,7 +233,8 @@ int tracer(int (*init_proc)(void *), void *sp)
}
set_cmdline("(tracing thread)");
while(1){
- if((pid = waitpid(-1, &status, WUNTRACED)) <= 0){
+ pid = waitpid(-1, &status, WUNTRACED);
+ if(pid <= 0){
if(errno != ECHILD){
printf("wait failed - errno = %d\n", errno);
}
diff --git a/arch/um/kernel/tty_log.c b/arch/um/kernel/tty_log.c
index 2b1e8b0..4be5740 100644
--- a/arch/um/kernel/tty_log.c
+++ b/arch/um/kernel/tty_log.c
@@ -9,7 +9,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
-#include <fcntl.h>
#include <sys/time.h>
#include "init.h"
#include "user.h"
@@ -54,8 +53,8 @@ int open_tty_log(void *tty, void *current_tty)
.direction = 0,
.sec = tv.tv_sec,
.usec = tv.tv_usec } );
- write(tty_log_fd, &data, sizeof(data));
- write(tty_log_fd, &current_tty, data.len);
+ os_write_file(tty_log_fd, &data, sizeof(data));
+ os_write_file(tty_log_fd, &current_tty, data.len);
return(tty_log_fd);
}
@@ -84,10 +83,10 @@ void close_tty_log(int fd, void *tty)
.direction = 0,
.sec = tv.tv_sec,
.usec = tv.tv_usec } );
- write(tty_log_fd, &data, sizeof(data));
+ os_write_file(tty_log_fd, &data, sizeof(data));
return;
}
- close(fd);
+ os_close_file(fd);
}
static int log_chunk(int fd, const char *buf, int len)
@@ -99,9 +98,12 @@ static int log_chunk(int fd, const char *buf, int len)
try = (len > sizeof(chunk)) ? sizeof(chunk) : len;
missed = copy_from_user_proc(chunk, (char *) buf, try);
try -= missed;
- n = write(fd, chunk, try);
- if(n != try)
- return(-errno);
+ n = os_write_file(fd, chunk, try);
+ if(n != try) {
+ if(n < 0)
+ return(n)
+ return(-EIO);
+ }
if(missed != 0)
return(-EFAULT);
@@ -128,7 +130,7 @@ int write_tty_log(int fd, const char *buf, int len, void *tty, int is_read)
.direction = direction,
.sec = tv.tv_sec,
.usec = tv.tv_usec } );
- write(tty_log_fd, &data, sizeof(data));
+ os_write_file(tty_log_fd, &data, sizeof(data));
}
return(log_chunk(fd, buf, len));
@@ -159,7 +161,7 @@ void log_exec(char **argv, void *tty)
.direction = 0,
.sec = tv.tv_sec,
.usec = tv.tv_usec } );
- write(tty_log_fd, &data, sizeof(data));
+ os_write_file(tty_log_fd, &data, sizeof(data));
for(ptr = argv; ; ptr++){
if(copy_from_user_proc(&arg, ptr, sizeof(arg)))
diff --git a/arch/um/kernel/umid.c b/arch/um/kernel/umid.c
index c8bff1b..ca275bc 100644
--- a/arch/um/kernel/umid.c
+++ b/arch/um/kernel/umid.c
@@ -5,7 +5,6 @@
#include <stdio.h>
#include <unistd.h>
-#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
@@ -87,7 +86,7 @@ static int __init create_pid_file(void)
{
char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")];
char pid[sizeof("nnnnn\0")];
- int fd;
+ int fd, n;
if(umid_file_name("pid", file, sizeof(file))) return 0;
@@ -95,14 +94,15 @@ static int __init create_pid_file(void)
0644);
if(fd < 0){
printf("Open of machine pid file \"%s\" failed - "
- "errno = %d\n", file, -fd);
+ "err = %d\n", file, -fd);
return 0;
}
sprintf(pid, "%d\n", os_getpid());
- if(write(fd, pid, strlen(pid)) != strlen(pid))
- printf("Write of pid file failed - errno = %d\n", errno);
- close(fd);
+ n = os_write_file(fd, pid, strlen(pid));
+ if(n != strlen(pid))
+ printf("Write of pid file failed - err = %d\n", -n);
+ os_close_file(fd);
return 0;
}
@@ -113,7 +113,8 @@ static int actually_do_remove(char *dir)
int len;
char file[256];
- if((directory = opendir(dir)) == NULL){
+ directory = opendir(dir);
+ if(directory == NULL){
printk("actually_do_remove : couldn't open directory '%s', "
"errno = %d\n", dir, errno);
return(1);
@@ -162,22 +163,24 @@ int not_dead_yet(char *dir)
{
char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")];
char pid[sizeof("nnnnn\0")], *end;
- int dead, fd, p;
+ int dead, fd, p, n;
sprintf(file, "%s/pid", dir);
dead = 0;
- if((fd = os_open_file(file, of_read(OPENFLAGS()), 0)) < 0){
+ fd = os_open_file(file, of_read(OPENFLAGS()), 0);
+ if(fd < 0){
if(fd != -ENOENT){
printk("not_dead_yet : couldn't open pid file '%s', "
- "errno = %d\n", file, -fd);
+ "err = %d\n", file, -fd);
return(1);
}
dead = 1;
}
if(fd > 0){
- if(read(fd, pid, sizeof(pid)) < 0){
+ n = os_read_file(fd, pid, sizeof(pid));
+ if(n < 0){
printk("not_dead_yet : couldn't read pid file '%s', "
- "errno = %d\n", file, errno);
+ "err = %d\n", file, -n);
return(1);
}
p = strtoul(pid, &end, 0);
@@ -234,7 +237,8 @@ static int __init make_uml_dir(void)
dir[len + 1] = '\0';
}
- if((uml_dir = malloc(strlen(dir) + 1)) == NULL){
+ uml_dir = malloc(strlen(dir) + 1);
+ if(uml_dir == NULL){
printf("make_uml_dir : malloc failed, errno = %d\n", errno);
exit(1);
}
@@ -264,7 +268,7 @@ static int __init make_umid(int (*printer)(const char *fmt, ...))
return(1);
}
- close(fd);
+ os_close_file(fd);
/* There's a nice tiny little race between this unlink and
* the mkdir below. It'd be nice if there were a mkstemp
* for directories.
@@ -275,7 +279,8 @@ static int __init make_umid(int (*printer)(const char *fmt, ...))
sprintf(tmp, "%s%s", uml_dir, umid);
- if((err = mkdir(tmp, 0777)) < 0){
+ err = mkdir(tmp, 0777);
+ if(err < 0){
if(errno == EEXIST){
if(not_dead_yet(tmp)){
(*printer)("umid '%s' is in use\n", umid);
diff --git a/arch/um/kernel/user_syms.c b/arch/um/kernel/user_syms.c
index 17d5986..7d86bbe 100644
--- a/arch/um/kernel/user_syms.c
+++ b/arch/um/kernel/user_syms.c
@@ -1,7 +1,7 @@
#include <stdio.h>
#include <unistd.h>
-#include <fcntl.h>
#include <dirent.h>
+#include <fcntl.h>
#include <errno.h>
#include <utime.h>
#include <string.h>
diff --git a/arch/um/kernel/user_util.c b/arch/um/kernel/user_util.c
index 0429b0e..41da13e 100644
--- a/arch/um/kernel/user_util.c
+++ b/arch/um/kernel/user_util.c
@@ -5,7 +5,6 @@
#include <stdio.h>
#include <stdlib.h>
-#include <fcntl.h>
#include <unistd.h>
#include <limits.h>
#include <sys/mman.h>
@@ -81,7 +80,8 @@ int wait_for_stop(int pid, int sig, int cont_type, void *relay)
int status, ret;
while(1){
- if(((ret = waitpid(pid, &status, WUNTRACED)) < 0) ||
+ ret = waitpid(pid, &status, WUNTRACED);
+ if((ret < 0) ||
!WIFSTOPPED(status) || (WSTOPSIG(status) != sig)){
if(ret < 0){
if(errno == EINTR) continue;
diff --git a/arch/um/main.c b/arch/um/main.c
index 3866884..ead5e2c 100644
--- a/arch/um/main.c
+++ b/arch/um/main.c
@@ -8,6 +8,7 @@
#include <stdlib.h>
#include <string.h>
#include <signal.h>
+#include <errno.h>
#include <sys/resource.h>
#include <sys/mman.h>
#include <sys/user.h>
@@ -123,12 +124,14 @@ int main(int argc, char **argv, char **envp)
set_stklim();
- if((new_argv = malloc((argc + 1) * sizeof(char *))) == NULL){
+ new_argv = malloc((argc + 1) * sizeof(char *));
+ if(new_argv == NULL){
perror("Mallocing argv");
exit(1);
}
for(i=0;i<argc;i++){
- if((new_argv[i] = strdup(argv[i])) == NULL){
+ new_argv[i] = strdup(argv[i]);
+ if(new_argv[i] == NULL){
perror("Mallocing an arg");
exit(1);
}
diff --git a/arch/um/os-Linux/drivers/ethertap_user.c b/arch/um/os-Linux/drivers/ethertap_user.c
index e275929..d4bb214 100644
--- a/arch/um/os-Linux/drivers/ethertap_user.c
+++ b/arch/um/os-Linux/drivers/ethertap_user.c
@@ -8,7 +8,6 @@
#include <stdio.h>
#include <unistd.h>
#include <stddef.h>
-#include <fcntl.h>
#include <stdlib.h>
#include <sys/errno.h>
#include <sys/socket.h>
@@ -42,13 +41,14 @@ static void etap_change(int op, unsigned char *addr, unsigned char *netmask,
{
struct addr_change change;
void *output;
+ int n;
change.what = op;
memcpy(change.addr, addr, sizeof(change.addr));
memcpy(change.netmask, netmask, sizeof(change.netmask));
- if(write(fd, &change, sizeof(change)) != sizeof(change))
- printk("etap_change - request failed, errno = %d\n",
- errno);
+ n = os_write_file(fd, &change, sizeof(change));
+ if(n != sizeof(change))
+ printk("etap_change - request failed, err = %d\n", -n);
output = um_kmalloc(page_size());
if(output == NULL)
printk("etap_change : Failed to allocate output buffer\n");
@@ -82,15 +82,15 @@ static void etap_pre_exec(void *arg)
struct etap_pre_exec_data *data = arg;
dup2(data->control_remote, 1);
- close(data->data_me);
- close(data->control_me);
+ os_close_file(data->data_me);
+ os_close_file(data->control_me);
}
static int etap_tramp(char *dev, char *gate, int control_me,
int control_remote, int data_me, int data_remote)
{
struct etap_pre_exec_data pe_data;
- int pid, status, err;
+ int pid, status, err, n;
char version_buf[sizeof("nnnnn\0")];
char data_fd_buf[sizeof("nnnnnn\0")];
char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")];
@@ -114,21 +114,21 @@ static int etap_tramp(char *dev, char *gate, int control_me,
pe_data.data_me = data_me;
pid = run_helper(etap_pre_exec, &pe_data, args, NULL);
- if(pid < 0) err = errno;
- close(data_remote);
- close(control_remote);
- if(read(control_me, &c, sizeof(c)) != sizeof(c)){
- printk("etap_tramp : read of status failed, errno = %d\n",
- errno);
- return(EINVAL);
+ if(pid < 0) err = pid;
+ os_close_file(data_remote);
+ os_close_file(control_remote);
+ n = os_read_file(control_me, &c, sizeof(c));
+ if(n != sizeof(c)){
+ printk("etap_tramp : read of status failed, err = %d\n", -n);
+ return(-EINVAL);
}
if(c != 1){
printk("etap_tramp : uml_net failed\n");
- err = EINVAL;
- if(waitpid(pid, &status, 0) < 0) err = errno;
- else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 1)){
+ err = -EINVAL;
+ if(waitpid(pid, &status, 0) < 0)
+ err = -errno;
+ else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 1))
printk("uml_net didn't exit with status 1\n");
- }
}
return(err);
}
@@ -143,14 +143,14 @@ static int etap_open(void *data)
if(err) return(err);
err = os_pipe(data_fds, 0, 0);
- if(err){
- printk("data os_pipe failed - errno = %d\n", -err);
+ if(err < 0){
+ printk("data os_pipe failed - err = %d\n", -err);
return(err);
}
err = os_pipe(control_fds, 1, 0);
- if(err){
- printk("control os_pipe failed - errno = %d\n", -err);
+ if(err < 0){
+ printk("control os_pipe failed - err = %d\n", -err);
return(err);
}
@@ -167,9 +167,9 @@ static int etap_open(void *data)
kfree(output);
}
- if(err != 0){
- printk("etap_tramp failed - errno = %d\n", err);
- return(-err);
+ if(err < 0){
+ printk("etap_tramp failed - err = %d\n", -err);
+ return(err);
}
pri->data_fd = data_fds[0];
@@ -183,11 +183,11 @@ static void etap_close(int fd, void *data)
struct ethertap_data *pri = data;
iter_addresses(pri->dev, etap_close_addr, &pri->control_fd);
- close(fd);
+ os_close_file(fd);
os_shutdown_socket(pri->data_fd, 1, 1);
- close(pri->data_fd);
+ os_close_file(pri->data_fd);
pri->data_fd = -1;
- close(pri->control_fd);
+ os_close_file(pri->control_fd);
pri->control_fd = -1;
}
diff --git a/arch/um/os-Linux/drivers/tuntap_user.c b/arch/um/os-Linux/drivers/tuntap_user.c
index 4475842..c8b1fab 100644
--- a/arch/um/os-Linux/drivers/tuntap_user.c
+++ b/arch/um/os-Linux/drivers/tuntap_user.c
@@ -8,7 +8,6 @@
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
-#include <fcntl.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/un.h>
@@ -61,7 +60,7 @@ static void tuntap_pre_exec(void *arg)
struct tuntap_pre_exec_data *data = arg;
dup2(data->stdout, 1);
- close(data->close_me);
+ os_close_file(data->close_me);
}
static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
@@ -86,7 +85,7 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
if(pid < 0) return(-pid);
- close(remote);
+ os_close_file(remote);
msg.msg_name = NULL;
msg.msg_namelen = 0;
@@ -107,19 +106,19 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
if(n < 0){
printk("tuntap_open_tramp : recvmsg failed - errno = %d\n",
errno);
- return(errno);
+ return(-errno);
}
waitpid(pid, NULL, 0);
cmsg = CMSG_FIRSTHDR(&msg);
if(cmsg == NULL){
printk("tuntap_open_tramp : didn't receive a message\n");
- return(EINVAL);
+ return(-EINVAL);
}
if((cmsg->cmsg_level != SOL_SOCKET) ||
(cmsg->cmsg_type != SCM_RIGHTS)){
printk("tuntap_open_tramp : didn't receive a descriptor\n");
- return(EINVAL);
+ return(-EINVAL);
}
*fd_out = ((int *) CMSG_DATA(cmsg))[0];
return(0);
@@ -133,27 +132,29 @@ static int tuntap_open(void *data)
int err, fds[2], len, used;
err = tap_open_common(pri->dev, pri->gate_addr);
- if(err) return(err);
+ if(err < 0)
+ return(err);
if(pri->fixed_config){
- if((pri->fd = open("/dev/net/tun", O_RDWR)) < 0){
- printk("Failed to open /dev/net/tun, errno = %d\n",
- errno);
- return(-errno);
+ pri->fd = os_open_file("/dev/net/tun", of_rdwr(OPENFLAGS()), 0);
+ if(pri->fd < 0){
+ printk("Failed to open /dev/net/tun, err = %d\n",
+ -pri->fd);
+ return(pri->fd);
}
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
strncpy(ifr.ifr_name, pri->dev_name, sizeof(ifr.ifr_name) - 1);
if(ioctl(pri->fd, TUNSETIFF, (void *) &ifr) < 0){
printk("TUNSETIFF failed, errno = %d", errno);
- close(pri->fd);
+ os_close_file(pri->fd);
return(-errno);
}
}
else {
err = os_pipe(fds, 0, 0);
- if(err){
- printk("tuntap_open : os_pipe failed - errno = %d\n",
+ if(err < 0){
+ printk("tuntap_open : os_pipe failed - err = %d\n",
-err);
return(err);
}
@@ -166,19 +167,19 @@ static int tuntap_open(void *data)
fds[1], buffer, len, &used);
output = buffer;
- if(err == 0){
- pri->dev_name = uml_strdup(buffer);
- output += IFNAMSIZ;
- printk(output);
- free_output_buffer(buffer);
- }
- else {
- printk(output);
+ if(err < 0) {
+ printk("%s", output);
free_output_buffer(buffer);
- printk("tuntap_open_tramp failed - errno = %d\n", err);
- return(-err);
+ printk("tuntap_open_tramp failed - err = %d\n", -err);
+ return(err);
}
- close(fds[0]);
+
+ pri->dev_name = uml_strdup(buffer);
+ output += IFNAMSIZ;
+ printk("%s", output);
+ free_output_buffer(buffer);
+
+ os_close_file(fds[0]);
iter_addresses(pri->dev, open_addr, pri->dev_name);
}
@@ -191,7 +192,7 @@ static void tuntap_close(int fd, void *data)
if(!pri->fixed_config)
iter_addresses(pri->dev, close_addr, pri->dev_name);
- close(fd);
+ os_close_file(fd);
pri->fd = -1;
}
diff --git a/arch/um/os-Linux/file.c b/arch/um/os-Linux/file.c
index 751cdfe..7bfab42 100644
--- a/arch/um/os-Linux/file.c
+++ b/arch/um/os-Linux/file.c
@@ -8,6 +8,8 @@
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/ioctl.h>
@@ -17,13 +19,207 @@
#include "user.h"
#include "kern_util.h"
-int os_file_type(char *file)
+static void copy_stat(struct uml_stat* dst, struct stat64* src)
+{
+ *dst=((struct uml_stat) {
+ .st_dev = src->st_dev, /* device */
+ .st_ino = src->st_ino, /* inode */
+ .st_mode = src->st_mode, /* protection */
+ .st_nlink = src->st_nlink, /* number of hard links */
+ .st_uid = src->st_uid, /* user ID of owner */
+ .st_gid = src->st_gid, /* group ID of owner */
+ .st_size = src->st_size, /* total size, in bytes */
+ .st_blksize = src->st_blksize, /* blocksize for filesys I/O */
+ .st_blocks = src->st_blocks, /* number of blocks allocated */
+ .st_atime = src->st_atime, /* time of last access */
+ .st_mtime = src->st_mtime, /* time of last modification */
+ .st_ctime = src->st_ctime, /* time of last change */
+ });
+}
+
+int os_stat_fd(const int fd, struct uml_stat* ubuf)
+{
+ struct stat64 sbuf;
+ int err;
+
+ do {
+ err = fstat64(fd, &sbuf);
+ } while((err < 0) && (errno == EINTR)) ;
+
+ if(err < 0)
+ return(-errno);
+
+ copy_stat(ubuf, &sbuf);
+ return(err);
+}
+
+int os_stat_file(const char* file_name, struct uml_stat* ubuf)
+{
+ struct stat64 sbuf;
+ int err;
+
+ do {
+ err = stat64(file_name, &sbuf);
+ } while((err < 0) && (errno==EINTR)) ;
+
+ if(err < 0)
+ return(-errno);
+ copy_stat(ubuf, &sbuf);
+ return(err);
+}
+
+int os_access(const char* file, int mode)
+{
+ int amode, err;
+
+ amode=(mode&OS_ACC_R_OK ? R_OK : 0) | (mode&OS_ACC_W_OK ? W_OK : 0) |
+ (mode&OS_ACC_X_OK ? X_OK : 0) | (mode&OS_ACC_F_OK ? F_OK : 0) ;
+
+ err = access(file, amode);
+ if(err < 0)
+ return(-errno);
+
+ return(0);
+}
+
+void os_print_error(int error, const char* str)
+{
+ errno = error < 0 ? -error : error;
+
+ perror(str);
+}
+
+/* FIXME? required only by hostaudio (because it passes ioctls verbatim) */
+int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg)
+{
+ int err;
+
+ err = ioctl(fd, cmd, arg);
+ if(err < 0)
+ return(-errno);
+
+ return(err);
+}
+
+int os_window_size(int fd, int *rows, int *cols)
+{
+ struct winsize size;
+
+ if(ioctl(fd, TIOCGWINSZ, &size) < 0)
+ return(-errno);
+
+ *rows = size.ws_row;
+ *cols = size.ws_col;
+
+ return(0);
+}
+
+int os_new_tty_pgrp(int fd, int pid)
+{
+ if(ioctl(fd, TIOCSCTTY, 0) < 0){
+ printk("TIOCSCTTY failed, errno = %d\n", errno);
+ return(-errno);
+ }
+
+ if(tcsetpgrp(fd, pid) < 0){
+ printk("tcsetpgrp failed, errno = %d\n", errno);
+ return(-errno);
+ }
+
+ return(0);
+}
+
+/* FIXME: ensure namebuf in os_get_if_name is big enough */
+int os_get_ifname(int fd, char* namebuf)
+{
+ if(ioctl(fd, SIOCGIFNAME, namebuf) < 0)
+ return(-errno);
+
+ return(0);
+}
+
+int os_set_slip(int fd)
+{
+ int disc, sencap;
+
+ disc = N_SLIP;
+ if(ioctl(fd, TIOCSETD, &disc) < 0){
+ printk("Failed to set slip line discipline - "
+ "errno = %d\n", errno);
+ return(-errno);
+ }
+
+ sencap = 0;
+ if(ioctl(fd, SIOCSIFENCAP, &sencap) < 0){
+ printk("Failed to set slip encapsulation - "
+ "errno = %d\n", errno);
+ return(-errno);
+ }
+
+ return(0);
+}
+
+int os_set_owner(int fd, int pid)
+{
+ if(fcntl(fd, F_SETOWN, pid) < 0){
+ int save_errno = errno;
+
+ if(fcntl(fd, F_GETOWN, 0) != pid){
+ return(-save_errno);
+ }
+ }
+
+ return(0);
+}
+
+/* FIXME? moved wholesale from sigio_user.c to get fcntls out of that file */
+int os_sigio_async(int master, int slave)
+{
+ int flags;
+
+ flags = fcntl(master, F_GETFL);
+ if(flags < 0) {
+ printk("fcntl F_GETFL failed, errno = %d\n", errno);
+ return(-errno);
+ }
+
+ if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) ||
+ (fcntl(master, F_SETOWN, os_getpid()) < 0)){
+ printk("fcntl F_SETFL or F_SETOWN failed, errno = %d\n", errno);
+ return(-errno);
+ }
+
+ if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0)){
+ printk("fcntl F_SETFL failed, errno = %d\n", errno);
+ return(-errno);
+ }
+
+ return(0);
+}
+
+int os_mode_fd(int fd, int mode)
{
- struct stat64 buf;
+ int err;
+
+ do {
+ err = fchmod(fd, mode);
+ } while((err < 0) && (errno==EINTR)) ;
- if(stat64(file, &buf) == -1)
+ if(err < 0)
return(-errno);
+ return(0);
+}
+
+int os_file_type(char *file)
+{
+ struct uml_stat buf;
+ int err;
+
+ err = os_stat_file(file, &buf);
+ if(err < 0)
+ return(err);
+
if(S_ISDIR(buf.st_mode)) return(OS_TYPE_DIR);
else if(S_ISLNK(buf.st_mode)) return(OS_TYPE_SYMLINK);
else if(S_ISCHR(buf.st_mode)) return(OS_TYPE_CHARDEV);
@@ -35,15 +231,21 @@ int os_file_type(char *file)
int os_file_mode(char *file, struct openflags *mode_out)
{
+ int err;
+
*mode_out = OPENFLAGS();
- if(!access(file, W_OK)) *mode_out = of_write(*mode_out);
- else if(errno != EACCES)
- return(-errno);
+ err = os_access(file, OS_ACC_W_OK);
+ if((err < 0) && (err != -EACCES))
+ return(err);
- if(!access(file, R_OK)) *mode_out = of_read(*mode_out);
- else if(errno != EACCES)
- return(-errno);
+ *mode_out = of_write(*mode_out);
+
+ err = os_access(file, OS_ACC_R_OK);
+ if((err < 0) && (err != -EACCES))
+ return(err);
+
+ *mode_out = of_read(*mode_out);
return(0);
}
@@ -63,13 +265,12 @@ int os_open_file(char *file, struct openflags flags, int mode)
if(flags.e) f |= O_EXCL;
fd = open64(file, f, mode);
- if(fd < 0) return(-errno);
+ if(fd < 0)
+ return(-errno);
- if(flags.cl){
- if(fcntl(fd, F_SETFD, 1)){
- close(fd);
- return(-errno);
- }
+ if(flags.cl && fcntl(fd, F_SETFD, 1)){
+ os_close_file(fd);
+ return(-errno);
}
return(fd);
@@ -129,7 +330,7 @@ int os_read_file(int fd, void *buf, int len)
return(n);
}
-int os_write_file(int fd, void *buf, int count)
+int os_write_file(int fd, const void *buf, int count)
{
int n;
@@ -152,50 +353,95 @@ int os_write_file(int fd, void *buf, int count)
int os_file_size(char *file, long long *size_out)
{
- struct stat64 buf;
+ struct uml_stat buf;
+ int err;
- if(stat64(file, &buf) == -1){
- printk("Couldn't stat \"%s\" : errno = %d\n", file, errno);
- return(-errno);
+ err = os_stat_file(file, &buf);
+ if(err < 0){
+ printk("Couldn't stat \"%s\" : err = %d\n", file, -err);
+ return(err);
}
+
if(S_ISBLK(buf.st_mode)){
int fd, blocks;
- if((fd = open64(file, O_RDONLY)) < 0){
- printk("Couldn't open \"%s\", errno = %d\n", file,
- errno);
- return(-errno);
+ fd = os_open_file(file, of_read(OPENFLAGS()), 0);
+ if(fd < 0){
+ printk("Couldn't open \"%s\", errno = %d\n", file, -fd);
+ return(fd);
}
if(ioctl(fd, BLKGETSIZE, &blocks) < 0){
printk("Couldn't get the block size of \"%s\", "
"errno = %d\n", file, errno);
- close(fd);
- return(-errno);
+ err = -errno;
+ os_close_file(fd);
+ return(err);
}
*size_out = ((long long) blocks) * 512;
- close(fd);
+ os_close_file(fd);
return(0);
}
*size_out = buf.st_size;
return(0);
}
+int os_get_exec_close(int fd, int* close_on_exec)
+{
+ int ret;
+
+ do {
+ ret = fcntl(fd, F_GETFD);
+ } while((ret < 0) && (errno == EINTR)) ;
+
+ if(ret < 0)
+ return(-errno);
+
+ *close_on_exec = (ret&FD_CLOEXEC) ? 1 : 0;
+ return(ret);
+}
+
+int os_set_exec_close(int fd, int close_on_exec)
+{
+ int flag, err;
+
+ if(close_on_exec) flag = FD_CLOEXEC;
+ else flag = 0;
+
+ do {
+ err = fcntl(fd, F_SETFD, flag);
+ } while((err < 0) && (errno == EINTR)) ;
+
+ if(err < 0)
+ return(-errno);
+ return(err);
+}
+
int os_pipe(int *fds, int stream, int close_on_exec)
{
int err, type = stream ? SOCK_STREAM : SOCK_DGRAM;
err = socketpair(AF_UNIX, type, 0, fds);
- if(err)
+ if(err < 0)
return(-errno);
if(!close_on_exec)
return(0);
- if((fcntl(fds[0], F_SETFD, 1) < 0) || (fcntl(fds[1], F_SETFD, 1) < 0))
- printk("os_pipe : Setting FD_CLOEXEC failed, errno = %d",
- errno);
+ err = os_set_exec_close(fds[0], 1);
+ if(err < 0)
+ goto error;
+
+ err = os_set_exec_close(fds[1], 1);
+ if(err < 0)
+ goto error;
return(0);
+
+ error:
+ printk("os_pipe : Setting FD_CLOEXEC failed, err = %d\n", -err);
+ os_close_file(fds[1]);
+ os_close_file(fds[0]);
+ return(err);
}
int os_set_fd_async(int fd, int owner)
@@ -275,7 +521,7 @@ int os_shutdown_socket(int fd, int r, int w)
return(-EINVAL);
}
err = shutdown(fd, what);
- if(err)
+ if(err < 0)
return(-errno);
return(0);
}
@@ -320,7 +566,7 @@ int os_rcv_fd(int fd, int *helper_pid_out)
return(new);
}
-int create_unix_socket(char *file, int len, int close_on_exec)
+int os_create_unix_socket(char *file, int len, int close_on_exec)
{
struct sockaddr_un addr;
int sock, err;
@@ -332,9 +578,12 @@ int create_unix_socket(char *file, int len, int close_on_exec)
return(-errno);
}
- if(close_on_exec && fcntl(sock, F_SETFD, 1) < 0)
- printk("create_unix_socket : Setting FD_CLOEXEC failed, "
- "errno = %d", errno);
+ if(close_on_exec) {
+ err = os_set_exec_close(sock, 1);
+ if(err < 0)
+ printk("create_unix_socket : close_on_exec failed, "
+ "err = %d", -err);
+ }
addr.sun_family = AF_UNIX;
diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c
index 734adea..d5f99fa 100644
--- a/arch/um/os-Linux/process.c
+++ b/arch/um/os-Linux/process.c
@@ -12,27 +12,31 @@
#include "os.h"
#include "user.h"
+#define ARBITRARY_ADDR -1
+#define FAILURE_PID -1
+
unsigned long os_process_pc(int pid)
{
char proc_stat[sizeof("/proc/#####/stat\0")], buf[256];
unsigned long pc;
- int fd;
+ int fd, err;
sprintf(proc_stat, "/proc/%d/stat", pid);
fd = os_open_file(proc_stat, of_read(OPENFLAGS()), 0);
if(fd < 0){
- printk("os_process_pc - couldn't open '%s', errno = %d\n",
- proc_stat, errno);
- return(-1);
+ printk("os_process_pc - couldn't open '%s', err = %d\n",
+ proc_stat, -fd);
+ return(ARBITRARY_ADDR);
}
- if(read(fd, buf, sizeof(buf)) < 0){
- printk("os_process_pc - couldn't read '%s', errno = %d\n",
- proc_stat, errno);
- close(fd);
- return(-1);
+ err = os_read_file(fd, buf, sizeof(buf));
+ if(err < 0){
+ printk("os_process_pc - couldn't read '%s', err = %d\n",
+ proc_stat, -err);
+ os_close_file(fd);
+ return(ARBITRARY_ADDR);
}
- close(fd);
- pc = -1;
+ os_close_file(fd);
+ pc = ARBITRARY_ADDR;
if(sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*d %*d %*d "
"%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d "
"%*d %*d %*d %*d %ld", &pc) != 1){
@@ -52,22 +56,23 @@ int os_process_parent(int pid)
snprintf(stat, sizeof(stat), "/proc/%d/stat", pid);
fd = os_open_file(stat, of_read(OPENFLAGS()), 0);
if(fd < 0){
- printk("Couldn't open '%s', errno = %d\n", stat, -fd);
- return(-1);
+ printk("Couldn't open '%s', err = %d\n", stat, -fd);
+ return(FAILURE_PID);
}
- n = read(fd, data, sizeof(data));
- close(fd);
+ n = os_read_file(fd, data, sizeof(data));
+ os_close_file(fd);
if(n < 0){
- printk("Couldn't read '%s', errno = %d\n", stat);
- return(-1);
+ printk("Couldn't read '%s', err = %d\n", stat, -n);
+ return(FAILURE_PID);
}
- parent = -1;
+ parent = FAILURE_PID;
/* XXX This will break if there is a space in the command */
n = sscanf(data, "%*d %*s %*c %d", &parent);
- if(n != 1) printk("Failed to scan '%s'\n", data);
+ if(n != 1)
+ printk("Failed to scan '%s'\n", data);
return(parent);
}
diff --git a/arch/um/os-Linux/tty.c b/arch/um/os-Linux/tty.c
index 2866ddb..4cfdd18 100644
--- a/arch/um/os-Linux/tty.c
+++ b/arch/um/os-Linux/tty.c
@@ -28,10 +28,10 @@ int get_pty(void)
struct grantpt_info info;
int fd;
- if((fd = os_open_file("/dev/ptmx", of_rdwr(OPENFLAGS()), 0)) < 0){
- printk("get_pty : Couldn't open /dev/ptmx - errno = %d\n",
- errno);
- return(-1);
+ fd = os_open_file("/dev/ptmx", of_rdwr(OPENFLAGS()), 0);
+ if(fd < 0){
+ printk("get_pty : Couldn't open /dev/ptmx - err = %d\n", -fd);
+ return(fd);
}
info.fd = fd;
@@ -39,7 +39,7 @@ int get_pty(void)
if(info.res < 0){
printk("get_pty : Couldn't grant pty - errno = %d\n",
- info.err);
+ -info.err);
return(-1);
}
if(unlockpt(fd) < 0){
diff --git a/arch/um/sys-i386/bugs.c b/arch/um/sys-i386/bugs.c
index 63d9dbc..fe4cbdb 100644
--- a/arch/um/sys-i386/bugs.c
+++ b/arch/um/sys-i386/bugs.c
@@ -4,7 +4,6 @@
*/
#include <unistd.h>
-#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/signal.h>
@@ -13,6 +12,7 @@
#include "user.h"
#include "sysdep/ptrace.h"
#include "task.h"
+#include "os.h"
#define MAXTOKEN 64
@@ -28,13 +28,15 @@ static char token(int fd, char *buf, int len, char stop)
ptr = buf;
end = &buf[len];
do {
- n = read(fd, ptr, sizeof(*ptr));
+ n = os_read_file(fd, ptr, sizeof(*ptr));
c = *ptr++;
- if(n == 0) return(0);
- else if(n != sizeof(*ptr)){
- printk("Reading /proc/cpuinfo failed, "
- "errno = %d\n", errno);
- return(-errno);
+ if(n != sizeof(*ptr)){
+ if(n == 0) return(0);
+ printk("Reading /proc/cpuinfo failed, err = %d\n", -n);
+ if(n < 0)
+ return(n);
+ else
+ return(-EIO);
}
} while((c != '\n') && (c != stop) && (ptr < end));
@@ -52,9 +54,9 @@ static int check_cpu_feature(char *feature, int *have_it)
int fd, len = sizeof(buf)/sizeof(buf[0]), n;
printk("Checking for host processor %s support...", feature);
- fd = open("/proc/cpuinfo", O_RDONLY);
+ fd = os_open_file("/proc/cpuinfo", of_read(OPENFLAGS()), 0);
if(fd < 0){
- printk("Couldn't open /proc/cpuinfo, errno = %d\n", errno);
+ printk("Couldn't open /proc/cpuinfo, err = %d\n", -fd);
return(0);
}
@@ -71,11 +73,10 @@ static int check_cpu_feature(char *feature, int *have_it)
if(!strncmp(buf, "flags", strlen("flags"))) break;
do {
- n = read(fd, &c, sizeof(c));
+ n = os_read_file(fd, &c, sizeof(c));
if(n != sizeof(c)){
printk("Failed to find newline in "
- "/proc/cpuinfo, n = %d, errno = %d\n",
- n, errno);
+ "/proc/cpuinfo, err = %d\n", -n);
goto out;
}
} while(c != '\n');
@@ -101,7 +102,7 @@ static int check_cpu_feature(char *feature, int *have_it)
out:
if(*have_it == 0) printk("No\n");
else if(*have_it == 1) printk("Yes\n");
- close(fd);
+ os_close_file(fd);
return(1);
}
@@ -128,7 +129,7 @@ void arch_check_bugs(void)
{
int have_it;
- if(access("/proc/cpuinfo", R_OK)){
+ if(os_access("/proc/cpuinfo", OS_ACC_R_OK) < 0){
printk("/proc/cpuinfo not available - skipping CPU capability "
"checks\n");
return;
diff --git a/include/asm-um/pgalloc.h b/include/asm-um/pgalloc.h
index 3039fe1..a623a92 100644
--- a/include/asm-um/pgalloc.h
+++ b/include/asm-um/pgalloc.h
@@ -54,7 +54,8 @@ static inline pgd_t *get_pgd_fast(void)
{
unsigned long *ret;
- if ((ret = pgd_quicklist) != NULL) {
+ ret = pgd_quicklist;
+ if (ret != NULL) {
pgd_quicklist = (unsigned long *)(*ret);
ret[0] = 0;
pgtable_cache_size--;
@@ -89,7 +90,8 @@ static inline pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long addr
{
unsigned long *ret;
- if ((ret = (unsigned long *)pte_quicklist) != NULL) {
+ ret = (unsigned long *)pte_quicklist;
+ if (ret != NULL) {
pte_quicklist = (unsigned long *)(*ret);
ret[0] = ret[1];
pgtable_cache_size--;