I don't think we need the whole authopen dance now we're running the writer as root.
authorCarl Hetherington <cth@carlh.net>
Mon, 27 Apr 2020 20:56:20 +0000 (22:56 +0200)
committerCarl Hetherington <cth@carlh.net>
Fri, 1 May 2020 23:50:32 +0000 (01:50 +0200)
blockdev/linux/file_dev.c

index 279724805eeddcf131eb9aceb775dbccfac820f6..4dc53f3f824e4a51d5bdc3542531cfc1e71aff42 100644 (file)
@@ -69,84 +69,31 @@ EXT4_BLOCKDEV_STATIC_INSTANCE(file_dev, EXT4_FILEDEV_BSIZE, 0, file_dev_open,
 /******************************************************************************/
 static int file_dev_open(struct ext4_blockdev *bdev)
 {
-#ifdef __APPLE__
-       /* We need to use authopen to open the device.  It asks the user for permission
-        * then give us an open fd over a socket.
-        */
-
-       int pipe[2];
-       if (socketpair(AF_UNIX, SOCK_STREAM, 0, pipe) < 0) {
-               return EFAULT;
-       }
-
-       pid_t pid = fork();
-       if (pid < 0) {
-               return EFAULT;
-       }
-
-       if (pid == 0) {
-               close(pipe[0]);
-               dup2(pipe[1], STDOUT_FILENO);
-               execl("/usr/libexec/authopen", "/usr/libexec/authopen", "-stdoutpipe", "-w", "-a", fname, (char *) 0);
-               exit(-1);
-       }
-
-       close(pipe[1]);
-
-       int dev = -1;
-
-       size_t const data_buffer_size = sizeof(struct cmsghdr) + sizeof(int);
-       char data_buffer[data_buffer_size];
-
-       struct iovec io_vec[1];
-       io_vec[0].iov_base = data_buffer;
-       io_vec[0].iov_len = data_buffer_size;
-
-       socklen_t const cmsg_socket_size = CMSG_SPACE(sizeof(int));
-       char cmsg_socket[cmsg_socket_size];
-       struct msghdr message = { 0 };
-       message.msg_iov = io_vec;
-       message.msg_iovlen = 1;
-       message.msg_control = cmsg_socket;
-       message.msg_controllen = cmsg_socket_size;
+       dev_file = fopen(fname, "r+b");
 
-       if (recvmsg(pipe[0], &message, 0) <= 0) {
+       if (!dev_file)
                return EIO;
-       }
 
-       struct cmsghdr* cmsg_socket_header = CMSG_FIRSTHDR(&message);
-       if (cmsg_socket_header && cmsg_socket_header->cmsg_level == SOL_SOCKET && cmsg_socket_header->cmsg_type == SCM_RIGHTS) {
-               dev = *((int *) CMSG_DATA(cmsg_socket_header));
-       }
+       /*No buffering at file.*/
+       setbuf(dev_file, 0);
 
+#ifdef __APPLE__
        /* The fseek/ftell approach to finding the device's size does not seem
         * to work on macOS so do it this way instead.
         */
        uint64_t sectors = 0;
-       if (ioctl(dev, DKIOCGETBLOCKCOUNT, &sectors) < 0) {
-               close(dev);
+       if (ioctl(fileno(dev_file), DKIOCGETBLOCKCOUNT, &sectors) < 0) {
+               fclose(dev_file);
                return EFAULT;
        }
        uint32_t sector_size = 0;
-       if (ioctl(dev, DKIOCGETBLOCKSIZE, &sector_size) < 0) {
-               close(dev);
+       if (ioctl(fileno(dev_file), DKIOCGETBLOCKSIZE, &sector_size) < 0) {
+               fclose(dev_file);
                return EFAULT;
        }
 
        off_t size = sectors * sector_size;
-
-       dev_file = fdopen(dev, "r+b");
 #else
-       dev_file = fopen(fname, "r+b");
-#endif
-
-       if (!dev_file)
-               return EIO;
-
-       /*No buffering at file.*/
-       setbuf(dev_file, 0);
-
-#ifndef __APPLE__
        if (fseeko(dev_file, 0, SEEK_END))
                return EFAULT;