1 /* 2 * Copyright (C) 2015-2016 Gerd Hoffmann <kraxel@redhat.com> 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 16 */ 17 #include "qemu/osdep.h" 18 #include "qemu/drm.h" 19 20 #include <glob.h> 21 #include <dirent.h> 22 23 int qemu_drm_rendernode_open(const char *rendernode) 24 { 25 DIR *dir; 26 struct dirent *e; 27 int r, fd; 28 char *p; 29 30 if (rendernode) { 31 return open(rendernode, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK); 32 } 33 34 dir = opendir("/dev/dri"); 35 if (!dir) { 36 return -1; 37 } 38 39 fd = -1; 40 while ((e = readdir(dir))) { 41 if (e->d_type != DT_CHR) { 42 continue; 43 } 44 45 if (strncmp(e->d_name, "renderD", 7)) { 46 continue; 47 } 48 49 p = g_strdup_printf("/dev/dri/%s", e->d_name); 50 51 r = open(p, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK); 52 if (r < 0) { 53 g_free(p); 54 continue; 55 } 56 fd = r; 57 g_free(p); 58 break; 59 } 60 61 closedir(dir); 62 if (fd < 0) { 63 return -1; 64 } 65 return fd; 66 } 67