Back to index

libdrm  2.4.37
Defines | Functions
drmtest.c File Reference
#include <string.h>
#include <fcntl.h>
#include <fnmatch.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include "drmtest.h"
#include <libudev.h>

Go to the source code of this file.

Defines

#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE

Functions

static int is_master (int fd)
int drm_open_matching (const char *pci_glob, int flags)
 Open the first DRM device matching the criteria.
int drm_open_any (void)
int drm_open_any_master (void)
 Open the first DRM device we can find where we end up being the master.

Define Documentation

Definition at line 35 of file drmtest.c.


Function Documentation

int drm_open_any ( void  )

Definition at line 109 of file drmtest.c.

{
       int fd = drm_open_matching("*:*", 0);

       if (fd < 0) {
              fprintf(stderr, "failed to open any drm device\n");
              exit(0);
       }

       return fd;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drm_open_any_master ( void  )

Open the first DRM device we can find where we end up being the master.

Definition at line 124 of file drmtest.c.

{
       int fd = drm_open_matching("*:*", DRM_TEST_MASTER);

       if (fd < 0) {
              fprintf(stderr, "failed to open any drm device\n");
              exit(0);
       }

       return fd;

}

Here is the call graph for this function:

Here is the caller graph for this function:

int drm_open_matching ( const char *  pci_glob,
int  flags 
)

Open the first DRM device matching the criteria.

Definition at line 58 of file drmtest.c.

{
       struct udev *udev;
       struct udev_enumerate *e;
       struct udev_device *device, *parent;
        struct udev_list_entry *entry;
       const char *pci_id, *path;
       const char *usub, *dnode;
       int fd;

       udev = udev_new();
       if (udev == NULL) {
              fprintf(stderr, "failed to initialize udev context\n");
              abort();
       }

       fd = -1;
       e = udev_enumerate_new(udev);
       udev_enumerate_add_match_subsystem(e, "drm");
        udev_enumerate_scan_devices(e);
        udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
              path = udev_list_entry_get_name(entry);
              device = udev_device_new_from_syspath(udev, path);
              parent = udev_device_get_parent(device);
              usub = udev_device_get_subsystem(parent);
              /* Filter out KMS output devices. */
              if (!usub || (strcmp(usub, "pci") != 0))
                     continue;
              pci_id = udev_device_get_property_value(parent, "PCI_ID");
              if (fnmatch(pci_glob, pci_id, 0) != 0)
                     continue;
              dnode = udev_device_get_devnode(device);
              if (strstr(dnode, "control"))
                     continue;
              fd = open(dnode, O_RDWR);
              if (fd < 0)
                     continue;
              if ((flags & DRM_TEST_MASTER) && !is_master(fd)) {
                     close(fd);
                     fd = -1;
                     continue;
              }

              break;
       }
        udev_enumerate_unref(e);
       udev_unref(udev);

       return fd;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int is_master ( int  fd) [static]

Definition at line 38 of file drmtest.c.

{
       drm_client_t client;
       int ret;

       /* Check that we're the only opener and authed. */
       client.idx = 0;
       ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client);
       assert (ret == 0);
       if (!client.auth)
              return 0;
       client.idx = 1;
       ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client);
       if (ret != -1 || errno != EINVAL)
              return 0;

       return 1;
}

Here is the caller graph for this function: