[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r12262 - gnunet/src/vpn
From: |
gnunet |
Subject: |
[GNUnet-SVN] r12262 - gnunet/src/vpn |
Date: |
Tue, 20 Jul 2010 07:45:29 +0200 |
Author: toelke
Date: 2010-07-20 07:45:29 +0200 (Tue, 20 Jul 2010)
New Revision: 12262
Modified:
gnunet/src/vpn/gnunet-vpn-helper-p.h
gnunet/src/vpn/gnunet-vpn-helper.c
Log:
communicate with the daemon over a specified protocoll
Modified: gnunet/src/vpn/gnunet-vpn-helper-p.h
===================================================================
--- gnunet/src/vpn/gnunet-vpn-helper-p.h 2010-07-20 05:45:26 UTC (rev
12261)
+++ gnunet/src/vpn/gnunet-vpn-helper-p.h 2010-07-20 05:45:29 UTC (rev
12262)
@@ -1,8 +1,12 @@
#ifndef GN_VPN_HELPER_P_H
#define GN_VPN_HELPER_P_H
+struct suid_packet_header {
+ uint32_t size;
+};
+
struct suid_packet {
- unsigned int size;
+ struct suid_packet_header hdr;
unsigned char data[1];
};
Modified: gnunet/src/vpn/gnunet-vpn-helper.c
===================================================================
--- gnunet/src/vpn/gnunet-vpn-helper.c 2010-07-20 05:45:26 UTC (rev 12261)
+++ gnunet/src/vpn/gnunet-vpn-helper.c 2010-07-20 05:45:29 UTC (rev 12262)
@@ -70,7 +70,7 @@
/* FIXME */ ioctl(fd, SIOCSIFFLAGS, &ifr);
} /* }}} */
-void setnonblocking(int fd) {
+void setnonblocking(int fd) {/*{{{*/
int opts;
opts = fcntl(fd,F_GETFL);
@@ -82,22 +82,11 @@
perror("fcntl(F_SETFL)");
}
return;
-}
+}/*}}}*/
-static int copy (int in, int out) {
+int main(int argc, char** argv) {
unsigned char buf[65600]; // 64k + 64;
- int r = read(in, buf, 65600);
- int w = 0;
- if (r < 0) return r;
- while (w < r) {
- int t = write(out, buf + w, r - w);
- if (t > 0) w += t;
- if (t < 0) return t;
- }
- return 0;
-}
-int main(int argc, char** argv) {
char dev[IFNAMSIZ];
memset(dev, 0, IFNAMSIZ);
@@ -123,18 +112,19 @@
fd_set fds_w;
fd_set fds_r;
- int r = 1;
- int w = 1;
- while(r != 0 && w != 0 && running == 1) {
+ int rea = 1;
+ int wri = 1;
+outer:
+ while(rea != 0 && wri != 0 && running == 1) {
FD_ZERO(&fds_w);
FD_ZERO(&fds_r);
- if (r) {
+ if (rea) {
FD_SET(fd_tun, &fds_r);
FD_SET(1, &fds_w);
}
- if (w) {
+ if (wri) {
FD_SET(0, &fds_r);
FD_SET(fd_tun, &fds_w);
}
@@ -143,17 +133,72 @@
if(r > 0) {
if (FD_ISSET(0, &fds_r) && FD_ISSET(fd_tun, &fds_w)) {
- if (copy(0, fd_tun) < 0) {
- fprintf(stderr, "Closing Write\n");
+ struct suid_packet *pkt = (struct suid_packet*)
buf;
+ r = read(0, buf, sizeof(struct
suid_packet_header));
+ if (r < 0) {
+ fprintf(stderr, "read-error: %m\n");
shutdown(fd_tun, SHUT_WR);
- w = 0;
+ shutdown(0, SHUT_RD);
+ wri=0;
+ goto outer;
}
+ r = 0;
+ while (r < ntohl(pkt->hdr.size)) {
+ int t = read(0, buf + r,
ntohl(pkt->hdr.size) - r);
+ if (r < 0) {
+ fprintf(stderr, "read-error:
%m\n");
+ shutdown(fd_tun, SHUT_WR);
+ shutdown(0, SHUT_RD);
+ wri=0;
+ goto outer;
+ }
+ r += t;
+ }
+ r = 0;
+ while (r < ntohl(pkt->hdr.size) - sizeof(struct
suid_packet_header)) {
+ int t = write(fd_tun, pkt->data,
ntohl(pkt->hdr.size) - sizeof(struct suid_packet_header) - r);
+ if (t < 0) {
+ fprintf(stderr, "write-error 3:
%m\n");
+ shutdown(fd_tun, SHUT_WR);
+ shutdown(0, SHUT_RD);
+ wri = 0;
+ goto outer;
+ }
+ r += t;
+ }
} else if (FD_ISSET(1, &fds_w) && FD_ISSET(fd_tun,
&fds_r)) {
- if (copy(fd_tun, 1) < 0) {
- fprintf(stderr, "Closing Read\n");
+ r = read(fd_tun, buf, 65600);
+ if (r < 0) {
+ fprintf(stderr, "read-error: %m\n");
shutdown(fd_tun, SHUT_RD);
- r = 0;
+ shutdown(1, SHUT_WR);
+ rea = 0;
+ goto outer;
}
+ struct suid_packet_header hdr = { .size =
htonl(r + sizeof(struct suid_packet_header))};
+ r = 0;
+ while(r < sizeof(struct suid_packet_header)) {
+ int t = write(1, &hdr, sizeof(struct
suid_packet_header) - r);
+ if (t < 0) {
+ fprintf(stderr, "write-error 2:
%m\n");
+ shutdown(fd_tun, SHUT_RD);
+ shutdown(1, SHUT_WR);
+ rea = 0;
+ goto outer;
+ }
+ r += t;
+ }
+ while(r < ntohl(hdr.size)) {
+ int t = write(1, buf, ntohl(hdr.size) -
r);
+ if (t < 0) {
+ fprintf(stderr, "write-error 1:
%m, written %d/%d\n", r, ntohl(hdr.size));
+ shutdown(fd_tun, SHUT_RD);
+ shutdown(1, SHUT_WR);
+ rea = 0;
+ goto outer;
+ }
+ r += t;
+ }
}
}
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r12262 - gnunet/src/vpn,
gnunet <=