| // Copyright 2014 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <glob.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <sys/ioctl.h> |
| #include <unistd.h> |
| |
| #include "label_detect.h" |
| |
| /* ioctl() with EINTR retry loop */ |
| int do_ioctl(int fd, int request, void* arg) { |
| int ret; |
| do { |
| ret = ioctl(fd, request, arg); |
| } while (ret == -1 && errno == EINTR); |
| return ret; |
| } |
| |
| /* Loops files matching a pattern to find any device satisfied predicate |
| * func(). */ |
| bool is_any_device(const char* pattern, bool (*func)(int fd)) { |
| int i; |
| glob_t g; |
| bool found = false; |
| |
| memset(&g, 0, sizeof(g)); |
| glob(pattern, 0, NULL, &g); |
| for (i = 0; i < g.gl_pathc; i++) { |
| TRACE("found device file %s\n", g.gl_pathv[i]); |
| int fd = open(g.gl_pathv[i], O_RDWR); |
| if (fd == -1) { |
| TRACE("failed to open device\n"); |
| continue; |
| } |
| if (func(fd)) { |
| found = true; |
| close(fd); |
| break; |
| } |
| close(fd); |
| } |
| globfree(&g); |
| return found; |
| } |
| |
| /* Converts FourCC 32 bits integer to printable string. */ |
| void convert_fourcc_to_str(uint32_t fourcc, char* str) { |
| str[0] = fourcc & 0xff; |
| str[1] = fourcc >> 8 & 0xff; |
| str[2] = fourcc >> 16 & 0xff; |
| str[3] = fourcc >> 24 & 0xff; |
| str[4] = '\0'; |
| } |