Blob Blame History Raw
diff -up pptp-1.7.2/pptp.c.alias pptp-1.7.2/pptp.c
--- pptp-1.7.2/pptp.c.alias	2011-12-06 22:24:06.617318769 +0000
+++ pptp-1.7.2/pptp.c	2011-12-06 22:36:25.761692858 +0000
@@ -463,7 +463,10 @@ int open_callmgr(struct in_addr inetaddr
         char **envp, int pty_fd, int gre_fd)
 {
     /* Try to open unix domain socket to call manager. */
-    struct sockaddr_un where;
+    union {
+        struct sockaddr a;
+        struct sockaddr_un u;
+    } where;
     const int NUM_TRIES = 3;
     int i, fd;
     pid_t pid;
@@ -473,12 +476,12 @@ int open_callmgr(struct in_addr inetaddr
         fatal("Could not create unix domain socket: %s", strerror(errno));
     }
     /* Make address */
-    callmgr_name_unixsock(&where, inetaddr, localbind);
+    callmgr_name_unixsock(&where.u, inetaddr, localbind);
     for (i = 0; i < NUM_TRIES; i++) {
-        if (connect(fd, (struct sockaddr *) &where, sizeof(where)) < 0) {
+        if (connect(fd, &where.a, sizeof(where.u)) < 0) {
             /* couldn't connect.  We'll have to launch this guy. */
 
-            unlink (where.sun_path);	
+            unlink (where.u.sun_path);
 
             /* fork and launch call manager process */
             switch (pid = fork()) {
diff -up pptp-1.7.2/pptp_callmgr.c.alias pptp-1.7.2/pptp_callmgr.c
--- pptp-1.7.2/pptp_callmgr.c.alias	2011-12-06 22:24:06.617318769 +0000
+++ pptp-1.7.2/pptp_callmgr.c	2011-12-06 22:34:46.142647941 +0000
@@ -196,14 +196,17 @@ int callmgr_main(int argc, char **argv,
         /* Step 5b: Handle new connection to UNIX socket */
         if (FD_ISSET(unix_sock, &read_set)) {
             /* New call! */
-            struct sockaddr_un from;
-            socklen_t len = sizeof(from);
+            union {
+                struct sockaddr a;
+                struct sockaddr_un u;
+            } from;
+            socklen_t len = sizeof(from.u);
             PPTP_CALL * call;
             struct local_callinfo *lci;
             int s;
             /* Accept the socket */
             FD_CLR (unix_sock, &read_set);
-            if ((s = accept(unix_sock, (struct sockaddr *) &from, &len)) < 0) {
+            if ((s = accept(unix_sock, &from.a, &len)) < 0) {
                 warn("Socket not accepted: %s", strerror(errno));
                 goto skip_accept;
             }
@@ -313,11 +316,14 @@ cleanup:
 /*** open_inetsock ************************************************************/
 int open_inetsock(struct in_addr inetaddr)
 {
-    struct sockaddr_in dest, src;
+    union {
+        struct sockaddr a;
+        struct sockaddr_in i;
+    } dest, src;
     int s;
-    dest.sin_family = AF_INET;
-    dest.sin_port   = htons(PPTP_PORT);
-    dest.sin_addr   = inetaddr;
+    dest.i.sin_family = AF_INET;
+    dest.i.sin_port   = htons(PPTP_PORT);
+    dest.i.sin_addr   = inetaddr;
     if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
         warn("socket: %s", strerror(errno));
         return s;
@@ -332,14 +338,14 @@ int open_inetsock(struct in_addr inetadd
 #endif
     if (localbind.s_addr != INADDR_NONE) {
         bzero(&src, sizeof(src));
-        src.sin_family = AF_INET;
-        src.sin_addr   = localbind;
-        if (bind(s, (struct sockaddr *) &src, sizeof(src)) != 0) {
+        src.i.sin_family = AF_INET;
+        src.i.sin_addr   = localbind;
+        if (bind(s, &src.a, sizeof(src.i)) != 0) {
             warn("bind: %s", strerror(errno));
             close(s); return -1;
         }
     }
-    if (connect(s, (struct sockaddr *) &dest, sizeof(dest)) < 0) {
+    if (connect(s, &dest.a, sizeof(dest.i)) < 0) {
         warn("connect: %s", strerror(errno));
         close(s); return -1;
     }
@@ -349,7 +355,10 @@ int open_inetsock(struct in_addr inetadd
 /*** open_unixsock ************************************************************/
 int open_unixsock(struct in_addr inetaddr)
 {
-    struct sockaddr_un where;
+    union {
+        struct sockaddr a;
+        struct sockaddr_un u;
+    } where;
     struct stat st;
     char *dir;
     int s;
@@ -357,21 +366,21 @@ int open_unixsock(struct in_addr inetadd
         warn("socket: %s", strerror(errno));
         return s;
     }
-    callmgr_name_unixsock( &where, inetaddr, localbind);
-    if (stat(where.sun_path, &st) >= 0) {
+    callmgr_name_unixsock( &where.u, inetaddr, localbind);
+    if (stat(where.u.sun_path, &st) >= 0) {
         warn("Call manager for %s is already running.", inet_ntoa(inetaddr));
         close(s); return -1;
     }
     /* Make sure path is valid. */
-    dir = dirname(where.sun_path);
+    dir = dirname(where.u.sun_path);
     if (!make_valid_path(dir, 0770))
-        fatal("Could not make path to %s: %s", where.sun_path, strerror(errno));
+        fatal("Could not make path to %s: %s", where.u.sun_path, strerror(errno));
     free(dir);
-    if (bind(s, (struct sockaddr *) &where, sizeof(where)) < 0) {
+    if (bind(s, &where.a, sizeof(where.u)) < 0) {
         warn("bind: %s", strerror(errno));
         close(s); return -1;
     }
-    chmod(where.sun_path, 0777);
+    chmod(where.u.sun_path, 0777);
     listen(s, 127);
     return s;
 }
diff -up pptp-1.7.2/pptp_gre.c.alias pptp-1.7.2/pptp_gre.c
--- pptp-1.7.2/pptp_gre.c.alias	2011-12-06 22:24:06.627318773 +0000
+++ pptp-1.7.2/pptp_gre.c	2011-12-06 22:24:06.629318775 +0000
@@ -85,7 +85,10 @@ uint64_t time_now_usecs(void)
 /*** Open IP protocol socket **************************************************/
 int pptp_gre_bind(struct in_addr inetaddr)
 {
-    struct sockaddr_in src_addr, loc_addr;
+    union {
+        struct sockaddr a;
+        struct sockaddr_in i;
+    } loc_addr, src_addr;
     int s = socket(AF_INET, SOCK_RAW, PPTP_PROTO);
     if (s < 0) { warn("socket: %s", strerror(errno)); return -1; }
 #ifdef SO_MARK
@@ -98,16 +101,16 @@ int pptp_gre_bind(struct in_addr inetadd
 #endif
     if (localbind.s_addr != INADDR_NONE) {
         bzero(&loc_addr, sizeof(loc_addr));
-        loc_addr.sin_family = AF_INET;
-        loc_addr.sin_addr   = localbind;
-        if (bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) != 0) {
+        loc_addr.i.sin_family = AF_INET;
+        loc_addr.i.sin_addr   = localbind;
+        if (bind(s, &loc_addr.a, sizeof(loc_addr.i)) != 0) {
             warn("bind: %s", strerror(errno)); close(s); return -1;
         }
     }
-    src_addr.sin_family = AF_INET;
-    src_addr.sin_addr   = inetaddr;
-    src_addr.sin_port   = 0;
-    if (connect(s, (struct sockaddr *) &src_addr, sizeof(src_addr)) < 0) {
+    src_addr.i.sin_family = AF_INET;
+    src_addr.i.sin_addr   = inetaddr;
+    src_addr.i.sin_port   = 0;
+    if (connect(s, &src_addr.a, sizeof(src_addr.i)) < 0) {
         warn("connect: %s", strerror(errno)); close(s); return -1;
     }
     my = test_redirections();