linux/samples/binderfs/binderfs_example.c
<<
>>
Prefs
   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
  18int 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}
  84