root/samples/binderfs/binderfs_example.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

   1 // SPDX-License-Identifier: GPL-2.0
   2 
   3 #define _GNU_SOURCE
   4 #include <errno.h>
   5 #include <fcntl.h>
   6 #include <sched.h>
   7 #include <stdio.h>
   8 #include <stdlib.h>
   9 #include <string.h>
  10 #include <sys/ioctl.h>
  11 #include <sys/mount.h>
  12 #include <sys/stat.h>
  13 #include <sys/types.h>
  14 #include <unistd.h>
  15 #include <linux/android/binder.h>
  16 #include <linux/android/binderfs.h>
  17 
  18 int main(int argc, char *argv[])
  19 {
  20         int fd, ret, saved_errno;
  21         size_t len;
  22         struct binderfs_device device = { 0 };
  23 
  24         ret = unshare(CLONE_NEWNS);
  25         if (ret < 0) {
  26                 fprintf(stderr, "%s - Failed to unshare mount namespace\n",
  27                         strerror(errno));
  28                 exit(EXIT_FAILURE);
  29         }
  30 
  31         ret = mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, 0);
  32         if (ret < 0) {
  33                 fprintf(stderr, "%s - Failed to mount / as private\n",
  34                         strerror(errno));
  35                 exit(EXIT_FAILURE);
  36         }
  37 
  38         ret = mkdir("/dev/binderfs", 0755);
  39         if (ret < 0 && errno != EEXIST) {
  40                 fprintf(stderr, "%s - Failed to create binderfs mountpoint\n",
  41                         strerror(errno));
  42                 exit(EXIT_FAILURE);
  43         }
  44 
  45         ret = mount(NULL, "/dev/binderfs", "binder", 0, 0);
  46         if (ret < 0) {
  47                 fprintf(stderr, "%s - Failed to mount binderfs\n",
  48                         strerror(errno));
  49                 exit(EXIT_FAILURE);
  50         }
  51 
  52         memcpy(device.name, "my-binder", strlen("my-binder"));
  53 
  54         fd = open("/dev/binderfs/binder-control", O_RDONLY | O_CLOEXEC);
  55         if (fd < 0) {
  56                 fprintf(stderr, "%s - Failed to open binder-control device\n",
  57                         strerror(errno));
  58                 exit(EXIT_FAILURE);
  59         }
  60 
  61         ret = ioctl(fd, BINDER_CTL_ADD, &device);
  62         saved_errno = errno;
  63         close(fd);
  64         errno = saved_errno;
  65         if (ret < 0) {
  66                 fprintf(stderr, "%s - Failed to allocate new binder device\n",
  67                         strerror(errno));
  68                 exit(EXIT_FAILURE);
  69         }
  70 
  71         printf("Allocated new binder device with major %d, minor %d, and name %s\n",
  72                device.major, device.minor, device.name);
  73 
  74         ret = unlink("/dev/binderfs/my-binder");
  75         if (ret < 0) {
  76                 fprintf(stderr, "%s - Failed to delete binder device\n",
  77                         strerror(errno));
  78                 exit(EXIT_FAILURE);
  79         }
  80 
  81         /* Cleanup happens when the mount namespace dies. */
  82         exit(EXIT_SUCCESS);
  83 }

/* [<][>][^][v][top][bottom][index][help] */