1eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke/*
2eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Copyright © 2011 Intel Corporation
3eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke *
4eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Permission is hereby granted, free of charge, to any person obtaining a
5eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * copy of this software and associated documentation files (the "Software"),
6eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * to deal in the Software without restriction, including without limitation
7eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * and/or sell copies of the Software, and to permit persons to whom the
9eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Software is furnished to do so, subject to the following conditions:
10eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke *
11eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * The above copyright notice and this permission notice (including the next
12eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * paragraph) shall be included in all copies or substantial portions of the
13eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Software.
14eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke *
15eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * DEALINGS IN THE SOFTWARE.
23eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke *
24eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Authors:
25eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke *    Benjamin Franzke <benjaminfranzke@googlemail.com>
26eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke */
27eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
28eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <stdio.h>
29eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <string.h>
30eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
31eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <libudev.h>
32eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <sys/types.h>
33eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <sys/stat.h>
34eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <unistd.h>
35eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
36eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include "common.h"
37eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include "gbmint.h"
38eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
39eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT struct udev_device *
40eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke_gbm_udev_device_new_from_fd(struct udev *udev, int fd)
41eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{
42eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   struct udev_device *device;
43eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   struct stat buf;
44eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
45eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   if (fstat(fd, &buf) < 0) {
46eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke      fprintf(stderr, "gbm: failed to stat fd %d", fd);
47eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke      return NULL;
48eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   }
49eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
50eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   device = udev_device_new_from_devnum(udev, 'c', buf.st_rdev);
51eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   if (device == NULL) {
52eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke      fprintf(stderr,
53eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke              "gbm: could not create udev device for fd %d", fd);
54eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke      return NULL;
55eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   }
56eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
57eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   return device;
58eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke}
59eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
60eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT char *
61eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke_gbm_fd_get_device_name(int fd)
62eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{
63eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   struct udev *udev;
64eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   struct udev_device *device;
65eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   const char *const_device_name;
66eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   char *device_name = NULL;
67eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
68eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   udev = udev_new();
69eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   device = _gbm_udev_device_new_from_fd(udev, fd);
70eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   if (device == NULL)
71eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke      return NULL;
72eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
73eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   const_device_name = udev_device_get_devnode(device);
74eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   if (!const_device_name)
75eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke      goto out;
76eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   device_name = strdup(const_device_name);
77eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
78eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkeout:
79eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   udev_device_unref(device);
80eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   udev_unref(udev);
81eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
82eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke   return device_name;
83eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke}
84eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke
85eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT void
86eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke_gbm_log(const char *fmt_str, ...)
87eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{
88eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke}
89