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