#include "user_util.h"
#include "kern_util.h"
#include "net_user.h"
-#include "helper.h"
#include "os.h"
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);
}
-void tap_check_ips(char *gate_addr, char *eth_addr)
+void tap_check_ips(char *gate_addr, unsigned char *eth_addr)
{
int tap_addr[4];
}
}
+/* Do reliable error handling as this fails frequently enough. */
void read_output(int fd, char *output, int len)
{
- int remain, n, actual;
+ int remain, ret, expected;
char c;
+ char *str;
if(output == NULL){
output = &c;
}
*output = '\0';
- if(read(fd, &remain, sizeof(remain)) != sizeof(remain)){
- printk("read_output - read of length failed, errno = %d\n",
- errno);
- return;
+ ret = os_read_file(fd, &remain, sizeof(remain));
+
+ if (ret != sizeof(remain)) {
+ expected = sizeof(remain);
+ str = "length";
+ goto err;
}
while(remain != 0){
- n = (remain < len) ? remain : len;
- actual = read(fd, output, n);
- if(actual != n){
- printk("read_output - read of data failed, "
- "errno = %d\n", errno);
- return;
+ expected = (remain < len) ? remain : len;
+ ret = os_read_file(fd, output, expected);
+ if (ret != expected) {
+ str = "data";
+ goto err;
}
- remain -= actual;
+ remain -= ret;
}
+
return;
+
+err:
+ if (ret < 0)
+ printk("read_output - read of %s failed, errno = %d\n", str, -ret);
+ else
+ printk("read_output - read of %s failed, read only %d of %d bytes\n", str, ret, expected);
}
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);
}
{
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)
{
struct change_pre_exec_data *data = arg;
- close(data->close_me);
+ os_close_file(data->close_me);
dup2(data->stdout, 1);
}
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]);
read_output(fds[0], output, output_len);
- waitpid(pid, NULL, 0);
+ os_close_file(fds[0]);
+ os_close_file(fds[1]);
+
+ if (pid > 0)
+ CATCH_EINTR(err = waitpid(pid, NULL, 0));
return(pid);
}