Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/regress/sys/kern/unfdpass - Kill some warnings, and enable W...



details:   https://anonhg.NetBSD.org/src/rev/e9654425f1de
branches:  trunk
changeset: 487254:e9654425f1de
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Mon Jun 05 06:01:42 2000 +0000

description:
- Kill some warnings, and enable WARNS=1.
- Use CMSG_SPACE() and CMSG_DATA() properly; don't define structures
  to hold messages, which will not have the correct alignment after
  the cmsg header.

diffstat:

 regress/sys/kern/unfdpass/Makefile   |   4 +-
 regress/sys/kern/unfdpass/unfdpass.c |  88 ++++++++++++++++++------------------
 2 files changed, 47 insertions(+), 45 deletions(-)

diffs (240 lines):

diff -r 31bb30e908e2 -r e9654425f1de regress/sys/kern/unfdpass/Makefile
--- a/regress/sys/kern/unfdpass/Makefile        Mon Jun 05 05:58:46 2000 +0000
+++ b/regress/sys/kern/unfdpass/Makefile        Mon Jun 05 06:01:42 2000 +0000
@@ -1,8 +1,10 @@
-#      $NetBSD: Makefile,v 1.5 2000/01/24 03:01:54 mycroft Exp $
+#      $NetBSD: Makefile,v 1.6 2000/06/05 06:01:42 thorpej Exp $
 
 PROG=  unfdpass
 MKMAN= no
 
+WARNS?=        1
+
 CLEANFILES+=file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 \
        file11 file12 file13 file14 file15 file16 file17 file18 file19 \
        file20 file21 file22 file23 file24 output test-sock
diff -r 31bb30e908e2 -r e9654425f1de regress/sys/kern/unfdpass/unfdpass.c
--- a/regress/sys/kern/unfdpass/unfdpass.c      Mon Jun 05 05:58:46 2000 +0000
+++ b/regress/sys/kern/unfdpass/unfdpass.c      Mon Jun 05 06:01:42 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: unfdpass.c,v 1.5 1999/03/22 18:19:54 sommerfe Exp $    */
+/*     $NetBSD: unfdpass.c,v 1.6 2000/06/05 06:01:42 thorpej Exp $     */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -54,6 +54,7 @@
 #include <signal.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdlib.h>
 #include <unistd.h>
 
 #define        SOCK_NAME       "test-sock"
@@ -67,15 +68,11 @@
 #define        MSG_SIZE        -1
 #define        NFILES          24
 
-struct fdcmessage {
-       struct cmsghdr cm;
-       int files[NFILES];
-};
+#define        FDCM_DATASIZE   (sizeof(int) * NFILES)
+#define        CRCM_DATASIZE   (SOCKCREDSIZE(NGROUPS))
 
-struct crcmessage {
-       struct cmsghdr cm;
-       char creds[SOCKCREDSIZE(NGROUPS)];
-};
+#define        MESSAGE_SIZE    (CMSG_SPACE(FDCM_DATASIZE) +                    \
+                        CMSG_SPACE(CRCM_DATASIZE))
 
 int chroot_rcvr = 0;
 int pass_dir = 0;
@@ -96,21 +93,21 @@
 #endif
        char *progname=argv[0];
        struct msghdr msg;
-       int listensock, sock, fd, i, status;
+       int listensock, sock, fd, i;
        char fname[16], buf[FILE_SIZE];
        struct cmsghdr *cmp;
-       struct {
-               struct fdcmessage fdcm;
-               struct crcmessage crcm;
-       } message;
+       void *message;
        int *files = NULL;
        struct sockcred *sc = NULL;
        struct sockaddr_un sun, csun;
        int csunlen;
-       fd_set oob;
        pid_t pid;
        int ch;
-       
+
+       message = malloc(CMSG_SPACE(MESSAGE_SIZE));
+       if (message == NULL)
+               err(1, "unable to malloc message buffer");
+       memset(message, 0, CMSG_SPACE(MESSAGE_SIZE));
 
        while ((ch = getopt(argc, argv, "DESdepr")) != -1) {
                switch(ch) {
@@ -228,10 +225,11 @@
         * Grab the descriptors and credentials passed to us.
         */
 
+       /* Expect 2 messages; descriptors and creds. */
        do {
                (void) memset(&msg, 0, sizeof(msg));
-               msg.msg_control = (caddr_t) &message;
-               msg.msg_controllen = sizeof(message);
+               msg.msg_control = message;
+               msg.msg_controllen = MESSAGE_SIZE;
 #if MSG_SIZE >= 0
                iov.iov_base = buf;
                iov.iov_len = MSG_SIZE;
@@ -243,7 +241,6 @@
                        err(1, "recvmsg");
 
                (void) close(sock);
-
                sock = -1;
 
                if (msg.msg_controllen == 0)
@@ -252,7 +249,6 @@
                if (msg.msg_flags & MSG_CTRUNC)
                        errx(1, "lost control message data");
 
-               cmp = CMSG_FIRSTHDR(&msg);
                for (cmp = CMSG_FIRSTHDR(&msg); cmp != NULL;
                     cmp = CMSG_NXTHDR(&msg, cmp)) {
                        if (cmp->cmsg_level != SOL_SOCKET)
@@ -261,15 +257,17 @@
 
                        switch (cmp->cmsg_type) {
                        case SCM_RIGHTS:
-                               if (cmp->cmsg_len != sizeof(message.fdcm))
-                                       errx(1, "bad fd control message length");
+                               if (cmp->cmsg_len != CMSG_LEN(FDCM_DATASIZE))
+                                       errx(1, "bad fd control message "
+                                           "length %d", cmp->cmsg_len);
 
                                files = (int *)CMSG_DATA(cmp);
                                break;
 
                        case SCM_CREDS:
-                               if (cmp->cmsg_len < sizeof(struct sockcred))
-                                       errx(1, "bad cred control message length");
+                               if (cmp->cmsg_len < CMSG_LEN(SOCKCREDSIZE(1)))
+                                       errx(1, "bad cred control message "
+                                           "length %d", cmp->cmsg_len);
 
                                sc = (struct sockcred *)CMSG_DATA(cmp);
                                break;
@@ -279,7 +277,6 @@
                                /* NOTREACHED */
                        }
                }
-       
 
                /*
                 * Read the files and print their contents.
@@ -323,7 +320,6 @@
                                printf("Credentials do NOT match.\n");
                }
        } while (sock != -1);
-       
 
        /*
         * All done!
@@ -355,13 +351,21 @@
        struct iovec iov;
 #endif
        struct msghdr msg;
-       char fname[16], buf[FILE_SIZE];
+       char fname[16];
        struct cmsghdr *cmp;
-       struct fdcmessage fdcm;
-       int i, fd, sock, nfd;
+       void *fdcm;
+       int i, fd, sock, nfd, *files;
        struct sockaddr_un sun;
        int spair[2];
-       
+
+       fdcm = malloc(CMSG_SPACE(FDCM_DATASIZE));
+       if (fdcm == NULL)
+               err(1, "unable to malloc fd control message");
+       memset(fdcm, 0, CMSG_SPACE(FDCM_DATASIZE));
+
+       cmp = fdcm;
+       files = (int *)CMSG_DATA(fdcm);
+
        /*
         * Create socket and connect to the receiver.
         */
@@ -380,10 +384,8 @@
        i = 0;
 
        if (pass_sock) {
-               fdcm.files[i++] = sock;
+               files[i++] = sock;
        }
-       
-
 
        if (pass_dir)
                nfd--;
@@ -397,7 +399,7 @@
                (void) sprintf(fname, "file%d", i + 1);
                if ((fd = open(fname, O_RDONLY, 0666)) == -1)
                        err(1, "child open %s", fname);
-               fdcm.files[i] = fd;
+               files[i] = fd;
        }
        
        if (pass_dir) {
@@ -407,12 +409,12 @@
                if ((fd = open(dirname, O_RDONLY, 0)) == -1) {
                        err(1, "child open directory %s", dirname);
                }
-               fdcm.files[i] = fd;
+               files[i] = fd;
        }
        
        (void) memset(&msg, 0, sizeof(msg));
-       msg.msg_control = (caddr_t) &fdcm;
-       msg.msg_controllen = sizeof(fdcm);
+       msg.msg_control = fdcm;
+       msg.msg_controllen = CMSG_LEN(FDCM_DATASIZE);
 #if MSG_SIZE >= 0
        iov.iov_base = buf;
        iov.iov_len = MSG_SIZE;
@@ -421,7 +423,7 @@
 #endif
 
        cmp = CMSG_FIRSTHDR(&msg);
-       cmp->cmsg_len = sizeof(fdcm);
+       cmp->cmsg_len = CMSG_LEN(FDCM_DATASIZE);
        cmp->cmsg_level = SOL_SOCKET;
        cmp->cmsg_type = SCM_RIGHTS;
 
@@ -433,14 +435,12 @@
                if (sendmsg(spair[0], &msg, 0) < 0)
                        err(1, "child prezel sendmsg");
 
-               close(fdcm.files[0]);
-               close(fdcm.files[1]);           
-               fdcm.files[0] = spair[0];
-               fdcm.files[1] = spair[1];               
+               close(files[0]);
+               close(files[1]);                
+               files[0] = spair[0];
+               files[1] = spair[1];            
                make_pretzel--;
        }
-       
-       
 
        if (sendmsg(sock, &msg, 0) == -1)
                err(1, "child sendmsg");



Home | Main Index | Thread Index | Old Index