gnunet-svn
[Top][All Lists]
Advanced

[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;
+                               }
                        }
                }
        }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]