199ca880aSopenharmony_ci/* 299ca880aSopenharmony_ci * Copyright (C) 2008-2009 Kay Sievers <kay@vrfy.org> 399ca880aSopenharmony_ci * 499ca880aSopenharmony_ci * This program is free software: you can redistribute it and/or modify 599ca880aSopenharmony_ci * it under the terms of the GNU General Public License as published by 699ca880aSopenharmony_ci * the Free Software Foundation, either version 2 of the License, or 799ca880aSopenharmony_ci * (at your option) any later version. 899ca880aSopenharmony_ci * 999ca880aSopenharmony_ci * This program is distributed in the hope that it will be useful, 1099ca880aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 1199ca880aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1299ca880aSopenharmony_ci * GNU General Public License for more details. 1399ca880aSopenharmony_ci * 1499ca880aSopenharmony_ci * You should have received a copy of the GNU General Public License 1599ca880aSopenharmony_ci * along with this program. If not, see <http://www.gnu.org/licenses/>. 1699ca880aSopenharmony_ci */ 1799ca880aSopenharmony_ci 1899ca880aSopenharmony_ci#include "udevadm-util.h" 1999ca880aSopenharmony_ci 2099ca880aSopenharmony_cistruct udev_device *find_device(struct udev *udev, 2199ca880aSopenharmony_ci const char *id, 2299ca880aSopenharmony_ci const char *prefix) { 2399ca880aSopenharmony_ci 2499ca880aSopenharmony_ci assert(udev); 2599ca880aSopenharmony_ci assert(id); 2699ca880aSopenharmony_ci 2799ca880aSopenharmony_ci if (prefix && !startswith(id, prefix)) 2899ca880aSopenharmony_ci id = strjoina(prefix, id); 2999ca880aSopenharmony_ci 3099ca880aSopenharmony_ci if (startswith(id, "/dev/")) { 3199ca880aSopenharmony_ci struct stat statbuf; 3299ca880aSopenharmony_ci char type; 3399ca880aSopenharmony_ci 3499ca880aSopenharmony_ci if (stat(id, &statbuf) < 0) 3599ca880aSopenharmony_ci return NULL; 3699ca880aSopenharmony_ci 3799ca880aSopenharmony_ci if (S_ISBLK(statbuf.st_mode)) 3899ca880aSopenharmony_ci type = 'b'; 3999ca880aSopenharmony_ci else if (S_ISCHR(statbuf.st_mode)) 4099ca880aSopenharmony_ci type = 'c'; 4199ca880aSopenharmony_ci else 4299ca880aSopenharmony_ci return NULL; 4399ca880aSopenharmony_ci 4499ca880aSopenharmony_ci return udev_device_new_from_devnum(udev, type, statbuf.st_rdev); 4599ca880aSopenharmony_ci } else if (startswith(id, "/sys/")) 4699ca880aSopenharmony_ci return udev_device_new_from_syspath(udev, id); 4799ca880aSopenharmony_ci else 4899ca880aSopenharmony_ci return NULL; 4999ca880aSopenharmony_ci} 50